From cd67fc1afea5830cdcfe99b9653277e182f29068 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Csan=C3=A1d=20Telbisz?= Date: Tue, 17 Jun 2025 10:19:36 +0200 Subject: [PATCH 01/48] Rename .java to .kt --- .../theta/core/decl/{BasicConstDecl.java => BasicConstDecl.kt} | 0 .../hu/bme/mit/theta/core/decl/{ConstDecl.java => ConstDecl.kt} | 0 .../main/java/hu/bme/mit/theta/core/decl/{Decl.java => Decl.kt} | 0 .../main/java/hu/bme/mit/theta/core/decl/{Decls.java => Decls.kt} | 0 .../core/decl/{IndexedConstDecl.java => IndexedConstDecl.kt} | 0 .../hu/bme/mit/theta/core/decl/{ParamDecl.java => ParamDecl.kt} | 0 .../java/hu/bme/mit/theta/core/decl/{VarDecl.java => VarDecl.kt} | 0 .../hu/bme/mit/theta/core/stmt/{AssignStmt.java => AssignStmt.kt} | 0 .../hu/bme/mit/theta/core/stmt/{AssumeStmt.java => AssumeStmt.kt} | 0 .../hu/bme/mit/theta/core/stmt/{HavocStmt.java => HavocStmt.kt} | 0 .../java/hu/bme/mit/theta/core/stmt/{IfStmt.java => IfStmt.kt} | 0 .../hu/bme/mit/theta/core/stmt/{LoopStmt.java => LoopStmt.kt} | 0 .../core/stmt/{MemoryAssignStmt.java => MemoryAssignStmt.kt} | 0 .../hu/bme/mit/theta/core/stmt/{NonDetStmt.java => NonDetStmt.kt} | 0 .../java/hu/bme/mit/theta/core/stmt/{OrtStmt.java => OrtStmt.kt} | 0 .../mit/theta/core/stmt/{SequenceStmt.java => SequenceStmt.kt} | 0 .../hu/bme/mit/theta/core/stmt/{SkipStmt.java => SkipStmt.kt} | 0 .../main/java/hu/bme/mit/theta/core/stmt/{Stmt.java => Stmt.kt} | 0 .../bme/mit/theta/core/stmt/{StmtVisitor.java => StmtVisitor.kt} | 0 .../main/java/hu/bme/mit/theta/core/stmt/{Stmts.java => Stmts.kt} | 0 .../hu/bme/mit/theta/core/type/{BinaryExpr.java => BinaryExpr.kt} | 0 .../main/java/hu/bme/mit/theta/core/type/{Expr.java => Expr.kt} | 0 .../java/hu/bme/mit/theta/core/type/{LitExpr.java => LitExpr.kt} | 0 .../mit/theta/core/type/{MultiaryExpr.java => MultiaryExpr.kt} | 0 .../bme/mit/theta/core/type/{NullaryExpr.java => NullaryExpr.kt} | 0 .../main/java/hu/bme/mit/theta/core/type/{Type.java => Type.kt} | 0 .../hu/bme/mit/theta/core/type/{UnaryExpr.java => UnaryExpr.kt} | 0 .../mit/theta/core/type/abstracttype/{AddExpr.java => AddExpr.kt} | 0 .../theta/core/type/abstracttype/{Additive.java => Additive.kt} | 0 .../theta/core/type/abstracttype/{CastExpr.java => CastExpr.kt} | 0 .../theta/core/type/abstracttype/{Castable.java => Castable.kt} | 0 .../theta/core/type/anytype/{Dereference.java => Dereference.kt} | 0 .../core/type/anytype/{InvalidLitExpr.java => InvalidLitExpr.kt} | 0 .../bme/mit/theta/core/type/anytype/{IteExpr.java => IteExpr.kt} | 0 .../mit/theta/core/type/anytype/{PrimeExpr.java => PrimeExpr.kt} | 0 .../bme/mit/theta/core/type/anytype/{RefExpr.java => RefExpr.kt} | 0 .../mit/theta/core/type/anytype/{Reference.java => Reference.kt} | 0 37 files changed, 0 insertions(+), 0 deletions(-) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/{BasicConstDecl.java => BasicConstDecl.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/{ConstDecl.java => ConstDecl.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/{Decl.java => Decl.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/{Decls.java => Decls.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/{IndexedConstDecl.java => IndexedConstDecl.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/{ParamDecl.java => ParamDecl.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/{VarDecl.java => VarDecl.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/{AssignStmt.java => AssignStmt.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/{AssumeStmt.java => AssumeStmt.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/{HavocStmt.java => HavocStmt.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/{IfStmt.java => IfStmt.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/{LoopStmt.java => LoopStmt.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/{MemoryAssignStmt.java => MemoryAssignStmt.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/{NonDetStmt.java => NonDetStmt.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/{OrtStmt.java => OrtStmt.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/{SequenceStmt.java => SequenceStmt.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/{SkipStmt.java => SkipStmt.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/{Stmt.java => Stmt.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/{StmtVisitor.java => StmtVisitor.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/{Stmts.java => Stmts.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/{BinaryExpr.java => BinaryExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/{Expr.java => Expr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/{LitExpr.java => LitExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/{MultiaryExpr.java => MultiaryExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/{NullaryExpr.java => NullaryExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/{Type.java => Type.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/{UnaryExpr.java => UnaryExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/{AddExpr.java => AddExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/{Additive.java => Additive.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/{CastExpr.java => CastExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/{Castable.java => Castable.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/{Dereference.java => Dereference.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/{InvalidLitExpr.java => InvalidLitExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/{IteExpr.java => IteExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/{PrimeExpr.java => PrimeExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/{RefExpr.java => RefExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/{Reference.java => Reference.kt} (100%) diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/BasicConstDecl.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/BasicConstDecl.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/BasicConstDecl.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/BasicConstDecl.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/ConstDecl.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/ConstDecl.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/ConstDecl.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/ConstDecl.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/Decl.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/Decl.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/Decl.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/Decl.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/Decls.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/Decls.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/Decls.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/Decls.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/IndexedConstDecl.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/IndexedConstDecl.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/IndexedConstDecl.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/IndexedConstDecl.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/ParamDecl.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/ParamDecl.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/ParamDecl.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/ParamDecl.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/VarDecl.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/VarDecl.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/VarDecl.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/VarDecl.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/AssignStmt.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/AssignStmt.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/AssignStmt.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/AssignStmt.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/AssumeStmt.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/AssumeStmt.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/AssumeStmt.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/AssumeStmt.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/HavocStmt.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/HavocStmt.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/HavocStmt.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/HavocStmt.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/IfStmt.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/IfStmt.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/IfStmt.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/IfStmt.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/LoopStmt.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/LoopStmt.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/LoopStmt.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/LoopStmt.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/MemoryAssignStmt.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/MemoryAssignStmt.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/MemoryAssignStmt.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/MemoryAssignStmt.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/NonDetStmt.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/NonDetStmt.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/NonDetStmt.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/NonDetStmt.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/OrtStmt.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/OrtStmt.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/OrtStmt.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/OrtStmt.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/SequenceStmt.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/SequenceStmt.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/SequenceStmt.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/SequenceStmt.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/SkipStmt.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/SkipStmt.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/SkipStmt.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/SkipStmt.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/Stmt.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/Stmt.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/Stmt.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/Stmt.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/StmtVisitor.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/StmtVisitor.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/StmtVisitor.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/StmtVisitor.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/Stmts.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/Stmts.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/Stmts.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/Stmts.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/BinaryExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/BinaryExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/BinaryExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/BinaryExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/Expr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/Expr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/Expr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/Expr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/LitExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/LitExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/LitExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/LitExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/MultiaryExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/MultiaryExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/MultiaryExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/MultiaryExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/NullaryExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/NullaryExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/NullaryExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/NullaryExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/Type.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/Type.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/Type.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/Type.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/UnaryExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/UnaryExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/UnaryExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/UnaryExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/AddExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/AddExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/AddExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/AddExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Additive.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Additive.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Additive.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Additive.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/CastExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/CastExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/CastExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/CastExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Castable.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Castable.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Castable.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Castable.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/Dereference.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/Dereference.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/Dereference.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/Dereference.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/InvalidLitExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/InvalidLitExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/InvalidLitExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/InvalidLitExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/IteExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/IteExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/IteExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/IteExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/PrimeExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/PrimeExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/PrimeExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/PrimeExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/RefExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/RefExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/RefExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/RefExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/Reference.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/Reference.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/Reference.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/Reference.kt From 893cd51550c62e241c0d9503707dd55c466e8887 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Csan=C3=A1d=20Telbisz?= Date: Tue, 17 Jun 2025 10:19:38 +0200 Subject: [PATCH 02/48] wip --- subprojects/common/core/build.gradle.kts | 1 + .../bme/mit/theta/core/decl/BasicConstDecl.kt | 19 +- .../hu/bme/mit/theta/core/decl/ConstDecl.kt | 30 ++- .../java/hu/bme/mit/theta/core/decl/Decl.kt | 61 +---- .../java/hu/bme/mit/theta/core/decl/Decls.kt | 39 +--- .../mit/theta/core/decl/IndexedConstDecl.kt | 40 ++-- .../mit/theta/core/decl/IndexedVarDecl.java | 50 ---- .../hu/bme/mit/theta/core/decl/ParamDecl.kt | 29 ++- .../hu/bme/mit/theta/core/decl/VarDecl.kt | 54 ++--- .../hu/bme/mit/theta/core/stmt/AssignStmt.kt | 122 +++------- .../hu/bme/mit/theta/core/stmt/AssumeStmt.kt | 96 ++------ .../hu/bme/mit/theta/core/stmt/HavocStmt.kt | 87 ++----- .../java/hu/bme/mit/theta/core/stmt/IfStmt.kt | 116 +++------- .../hu/bme/mit/theta/core/stmt/LoopStmt.kt | 149 ++++-------- .../mit/theta/core/stmt/MemoryAssignStmt.kt | 129 ++++------- .../hu/bme/mit/theta/core/stmt/NonDetStmt.kt | 95 +++----- .../hu/bme/mit/theta/core/stmt/OrtStmt.kt | 95 +++----- .../bme/mit/theta/core/stmt/SequenceStmt.kt | 94 +++----- .../hu/bme/mit/theta/core/stmt/SkipStmt.kt | 66 +----- .../java/hu/bme/mit/theta/core/stmt/Stmt.kt | 33 ++- .../hu/bme/mit/theta/core/stmt/StmtVisitor.kt | 61 ++--- .../java/hu/bme/mit/theta/core/stmt/Stmts.kt | 95 ++++---- .../hu/bme/mit/theta/core/type/BinaryExpr.kt | 99 +++----- .../java/hu/bme/mit/theta/core/type/Expr.kt | 71 ++++-- .../hu/bme/mit/theta/core/type/LitExpr.kt | 14 +- .../bme/mit/theta/core/type/MultiaryExpr.kt | 77 ++----- .../hu/bme/mit/theta/core/type/NullaryExpr.kt | 38 ++-- .../java/hu/bme/mit/theta/core/type/Type.kt | 17 +- .../hu/bme/mit/theta/core/type/UnaryExpr.kt | 79 ++----- .../theta/core/type/abstracttype/AddExpr.kt | 36 ++- .../theta/core/type/abstracttype/Additive.kt | 17 +- .../theta/core/type/abstracttype/CastExpr.kt | 19 +- .../theta/core/type/abstracttype/Castable.kt | 17 +- .../theta/core/type/anytype/Dereference.kt | 188 ++++++--------- .../theta/core/type/anytype/InvalidLitExpr.kt | 51 ++--- .../mit/theta/core/type/anytype/IteExpr.kt | 214 +++++++----------- .../mit/theta/core/type/anytype/PrimeExpr.kt | 81 +++---- .../mit/theta/core/type/anytype/RefExpr.kt | 86 +++---- .../mit/theta/core/type/anytype/Reference.kt | 106 ++++----- .../hu/bme/mit/theta/xcfa/passes/SsaPass.kt | 147 ------------ 40 files changed, 929 insertions(+), 1989 deletions(-) delete mode 100644 subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/IndexedVarDecl.java delete mode 100644 subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/SsaPass.kt diff --git a/subprojects/common/core/build.gradle.kts b/subprojects/common/core/build.gradle.kts index e8b16987d2..c11d9c4492 100644 --- a/subprojects/common/core/build.gradle.kts +++ b/subprojects/common/core/build.gradle.kts @@ -18,6 +18,7 @@ plugins { id("antlr-grammar") id("java-test-fixtures") id("kotlin-common") + id("kaml-serialization") } dependencies { diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/BasicConstDecl.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/BasicConstDecl.kt index af0d3902ab..5e5fdaab7f 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/BasicConstDecl.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/BasicConstDecl.kt @@ -13,18 +13,21 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.decl; -import hu.bme.mit.theta.core.type.Type; +package hu.bme.mit.theta.core.decl + +import hu.bme.mit.theta.core.type.Type +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable /** * A basic constant declaration that can be directly passed to the SMT solver. * * @param */ -public final class BasicConstDecl extends ConstDecl { - - BasicConstDecl(final String name, final DeclType type) { - super(name, type); - } -} +@Serializable +@SerialName("BasicConstDecl") +data class BasicConstDecl( + override val name: String, + override val type: DeclType +) : ConstDecl() \ No newline at end of file diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/ConstDecl.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/ConstDecl.kt index 5331999b49..a64d599c38 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/ConstDecl.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/ConstDecl.kt @@ -13,28 +13,26 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.decl; -import hu.bme.mit.theta.common.Utils; -import hu.bme.mit.theta.core.type.Type; +package hu.bme.mit.theta.core.decl + +import hu.bme.mit.theta.common.Utils +import hu.bme.mit.theta.core.type.Type +import kotlinx.serialization.Serializable /** - * Abstract base class for constants. Use {@link BasicConstDecl} for a basic constant, or {@link - * IndexedConstDecl} if the constant belongs to a variable for some index (e.g., during unfolding + * Abstract base class for constants. Use [BasicConstDecl] for a basic constant, or + * [IndexedConstDecl] if the constant belongs to a variable for some index (e.g., during unfolding * paths). * * @param */ -public abstract class ConstDecl extends Decl { - - private static final String DECL_LABEL = "Const"; - - ConstDecl(final String name, final DeclType type) { - super(name, type); +@Serializable +abstract class ConstDecl : Decl() { + companion object { + private const val DECL_LABEL = "Const" } - @Override - public final String toString() { - return Utils.lispStringBuilder(DECL_LABEL).add(getName()).add(getType()).toString(); - } -} + override fun toString(): String = + Utils.lispStringBuilder(DECL_LABEL).add(name).add(type).toString() +} \ No newline at end of file diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/Decl.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/Decl.kt index d08caf12f2..a95e726c54 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/Decl.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/Decl.kt @@ -13,58 +13,19 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.decl; -import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.base.Preconditions.checkNotNull; -import static hu.bme.mit.theta.core.type.anytype.Exprs.Ref; +package hu.bme.mit.theta.core.decl -import hu.bme.mit.theta.core.type.Type; -import hu.bme.mit.theta.core.type.anytype.RefExpr; +import hu.bme.mit.theta.core.type.Type +import hu.bme.mit.theta.core.type.anytype.Exprs.Ref +import hu.bme.mit.theta.core.type.anytype.RefExpr +import kotlinx.serialization.Serializable -public abstract class Decl { +@Serializable +abstract class Decl { - private static final int HASH_SEED = 5351; - private volatile int hashCode = 0; + abstract val name: String + abstract val type: DeclType - private final String name; - private final DeclType type; - private final RefExpr ref; - - public Decl(final String name, final DeclType type) { - checkNotNull(name); - checkArgument(!name.isEmpty()); - this.name = name; - this.type = checkNotNull(type); - this.ref = Ref(this); - } - - public final String getName() { - return name; - } - - public final DeclType getType() { - return type; - } - - public final RefExpr getRef() { - return ref; - } - - @Override - public final int hashCode() { - int result = hashCode; - if (result == 0) { - result = HASH_SEED; - result = 31 * result + getName().hashCode(); - result = 31 * result + getType().hashCode(); - hashCode = result; - } - return result; - } - - @Override - public final boolean equals(final Object obj) { - return this == obj; - } -} + val ref: RefExpr by lazy { Ref(this) } +} \ No newline at end of file diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/Decls.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/Decls.kt index a5efae9451..9a21dae5b0 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/Decls.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/Decls.kt @@ -13,48 +13,25 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.decl; -import hu.bme.mit.theta.core.type.Type; +package hu.bme.mit.theta.core.decl -/** Factory class to create declarations. */ -public final class Decls { - - private Decls() {} +import hu.bme.mit.theta.core.type.Type +/** Factory class to create declarations. */ +object Decls { /** * Create a constant declaration with a given name and type. - * - * @param name - * @param type - * @param - * @return */ - public static ConstDecl Const(final String name, final T type) { - return new BasicConstDecl<>(name, type); - } + fun Const(name: String, type: T): ConstDecl = BasicConstDecl(name, type) /** * Create a parameter declaration with a given name and type. - * - * @param name - * @param type - * @param - * @return */ - public static ParamDecl Param(final String name, final T type) { - return new ParamDecl<>(name, type); - } + fun Param(name: String, type: T): ParamDecl = ParamDecl(name, type) /** * Create a variable declaration with a given type. - * - * @param name - * @param type - * @param - * @return */ - public static VarDecl Var(final String name, final T type) { - return new VarDecl<>(name, type); - } -} + fun Var(name: String, type: T): VarDecl = VarDecl(name, type) +} \ No newline at end of file diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/IndexedConstDecl.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/IndexedConstDecl.kt index 8a50879cde..7cf627e4eb 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/IndexedConstDecl.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/IndexedConstDecl.kt @@ -13,38 +13,34 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.decl; -import static com.google.common.base.Preconditions.checkArgument; +package hu.bme.mit.theta.core.decl -import hu.bme.mit.theta.core.type.Type; +import hu.bme.mit.theta.core.type.Type +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable /** - * A constant declaration that belongs to a variable ({@link VarDecl} declaration for a given index. + * A constant declaration that belongs to a variable ([VarDecl] declaration for a given index. * For example, when unfolding a path, each variable will have a new constant for each step of the * path. * * @param */ -public final class IndexedConstDecl extends ConstDecl { - - private static final String NAME_FORMAT = "_%s:%d"; - - private final VarDecl varDecl; - private final int index; - - IndexedConstDecl(final VarDecl varDecl, final int index) { - super(String.format(NAME_FORMAT, varDecl.getName(), index), varDecl.getType()); - checkArgument(index >= 0); - this.varDecl = varDecl; - this.index = index; +@Serializable +@SerialName("IndexedConstDecl") +data class IndexedConstDecl( + val varDecl: VarDecl, + val index: Int +) : ConstDecl() { + init { + require(index >= 0) { "Index must be non-negative" } } - public VarDecl getVarDecl() { - return varDecl; + companion object { + private const val NAME_FORMAT: String = "_%s:%d" } - public int getIndex() { - return index; - } -} + override val name: String = String.format(NAME_FORMAT, varDecl.name, index) + override val type: DeclType = varDecl.type +} \ No newline at end of file diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/IndexedVarDecl.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/IndexedVarDecl.java deleted file mode 100644 index c84943485d..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/IndexedVarDecl.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.decl; - -import hu.bme.mit.theta.core.type.Type; -import hu.bme.mit.theta.core.type.anytype.RefExpr; - -public class IndexedVarDecl extends VarDecl { - - private final VarDecl original; - private final ConstDecl constDecl; - private final RefExpr constRef; - - IndexedVarDecl(final String name, final VarDecl original) { - super(name, original.getType()); - this.original = original; - this.constDecl = Decls.Const(name, original.getType()); - this.constRef = RefExpr.of(constDecl); - } - - public static IndexedVarDecl of( - final String name, final VarDecl original) { - return new IndexedVarDecl<>(name, original); - } - - public VarDecl getOriginal() { - return original; - } - - public RefExpr getConstRef() { - return constRef; - } - - public ConstDecl getConst() { - return constDecl; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/ParamDecl.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/ParamDecl.kt index cfa4c1fd13..e10e86d118 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/ParamDecl.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/ParamDecl.kt @@ -13,21 +13,26 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.decl; -import hu.bme.mit.theta.common.Utils; -import hu.bme.mit.theta.core.type.Type; +package hu.bme.mit.theta.core.decl -public final class ParamDecl extends Decl { +import hu.bme.mit.theta.common.Utils +import hu.bme.mit.theta.core.type.Type +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable - private static final String DECL_LABEL = "Param"; +@Serializable +@SerialName(ParamDecl.DECL_LABEL) +data class ParamDecl( + override val name: String, + override val type: DeclType +) : Decl() { - ParamDecl(final String name, final DeclType type) { - super(name, type); - } + companion object { - @Override - public String toString() { - return Utils.lispStringBuilder(DECL_LABEL).add(getName()).add(getType()).toString(); + internal const val DECL_LABEL: String = "Param" } -} + + override fun toString(): String = + Utils.lispStringBuilder(DECL_LABEL).add(name).add(type).toString() +} \ No newline at end of file diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/VarDecl.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/VarDecl.kt index d416347a7a..1c33afb0e3 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/VarDecl.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/VarDecl.kt @@ -13,49 +13,43 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.decl; -import static com.google.common.base.Preconditions.checkArgument; +package hu.bme.mit.theta.core.decl -import hu.bme.mit.theta.common.Utils; -import hu.bme.mit.theta.common.container.Containers; -import hu.bme.mit.theta.core.type.Type; -import java.util.Map; +import hu.bme.mit.theta.common.Utils +import hu.bme.mit.theta.core.type.Type +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.Transient /** * Represents a variable declaration. Variables cannot be directly passed to the SMT solver, they - * must be replaced with constants for a given index ({@link IndexedConstDecl}). See also {@link - * hu.bme.mit.theta.core.utils.PathUtils}. + * must be replaced with constants for a given index ([IndexedConstDecl]). See also [hu.bme.mit.theta.core.utils.PathUtils]. * * @param */ -public class VarDecl extends Decl { +@Serializable +@SerialName(VarDecl.DECL_LABEL) +data class VarDecl( + override val name: String, + override val type: DeclType +) : Decl() { - private static final String DECL_LABEL = "var"; + companion object { - private final Map> indexToConst; + internal const val DECL_LABEL: String = "var" - VarDecl(final String name, final DeclType type) { - super(name, type); - indexToConst = Containers.createMap(); + fun copyOf(from: VarDecl): VarDecl = VarDecl(from.name, from.type) } - public static VarDecl copyOf(VarDecl from) { - return new VarDecl<>(from.getName(), from.getType()); - } + @Transient + private val indexToConst = mutableMapOf>() - public IndexedConstDecl getConstDecl(final int index) { - checkArgument(index >= 0); - IndexedConstDecl constDecl = indexToConst.get(index); - if (constDecl == null) { - constDecl = new IndexedConstDecl<>(this, index); - indexToConst.put(index, constDecl); - } - return constDecl; + fun getConstDecl(index: Int): IndexedConstDecl { + require(index >= 0) { "Index must be non-negative" } + return indexToConst.getOrPut(index) { IndexedConstDecl(this, index) } } - @Override - public String toString() { - return Utils.lispStringBuilder(DECL_LABEL).add(getName()).add(getType()).toString(); - } -} + override fun toString(): String = + Utils.lispStringBuilder(DECL_LABEL).add(name).add(type).toString() +} \ No newline at end of file diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/AssignStmt.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/AssignStmt.kt index a1ca15e0a7..7ec1a4ea99 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/AssignStmt.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/AssignStmt.kt @@ -1,102 +1,44 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.stmt; - -import static com.google.common.base.Preconditions.checkNotNull; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; +package hu.bme.mit.theta.core.stmt -import hu.bme.mit.theta.common.Utils; -import hu.bme.mit.theta.core.decl.VarDecl; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.Type; +import hu.bme.mit.theta.common.Utils +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.Type +import hu.bme.mit.theta.core.decl.VarDecl +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable /** - * Assignment statement of the form VARIABLE := EXPRESSION. The statement updates the VARIABLE with + * Assignment statement of the form `VARIABLE := EXPRESSION`. The statement updates the VARIABLE with * the result of EXPRESSION. * * @param */ -public final class AssignStmt implements Stmt { - - private static final int HASH_SEED = 409; - private static final String STMT_LABEL = "assign"; - - private volatile int hashCode = 0; - - private final VarDecl varDecl; - private final Expr expr; - - private AssignStmt(final VarDecl varDecl, final Expr expr) { - this.varDecl = checkNotNull(varDecl); - this.expr = checkNotNull(expr); - } - - public static AssignStmt of( - final VarDecl lhs, final Expr rhs) { - return new AssignStmt<>(lhs, rhs); - } - - public static AssignStmt create( - final VarDecl lhs, final Expr rhs) { - @SuppressWarnings("unchecked") - final VarDecl newLhs = (VarDecl) lhs; - final Expr newRhs = cast(rhs, newLhs.getType()); - return AssignStmt.of(newLhs, newRhs); - } - - public VarDecl getVarDecl() { - return varDecl; - } - - public Expr getExpr() { - return expr; - } - - @Override - public R accept(final StmtVisitor visitor, final P param) { - return visitor.visit(this, param); - } - - @Override - public int hashCode() { - int result = hashCode; - if (result == 0) { - result = HASH_SEED; - result = 31 * result + varDecl.hashCode(); - result = 31 * result + expr.hashCode(); - hashCode = result; +@Serializable +@SerialName(AssignStmt.STMT_LABEL) +data class AssignStmt( + val varDecl: VarDecl, + val expr: Expr +) : Stmt { + + companion object { + + internal const val STMT_LABEL = "assign" + + @JvmStatic + fun of(lhs: VarDecl, rhs: Expr): AssignStmt = + AssignStmt(lhs, rhs) + + @JvmStatic + @Suppress("UNCHECKED_CAST") + fun create(lhs: VarDecl<*>, rhs: Expr<*>): AssignStmt { + val newLhs = lhs as VarDecl + val newRhs = cast(rhs, newLhs.type) + return of(newLhs, newRhs) } - return result; } - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final AssignStmt that = (AssignStmt) obj; - return this.getVarDecl().equals(that.getVarDecl()) - && this.getExpr().equals(that.getExpr()); - } else { - return false; - } - } + override fun accept(visitor: StmtVisitor, param: P): R = visitor.visit(this, param) - @Override - public String toString() { - return Utils.lispStringBuilder(STMT_LABEL).add(varDecl.getName()).add(expr).toString(); - } + override fun toString(): String = Utils.lispStringBuilder(STMT_LABEL).add(varDecl.name).add(expr).toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/AssumeStmt.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/AssumeStmt.kt index 0a6c4e5d7f..d8ad63b8ee 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/AssumeStmt.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/AssumeStmt.kt @@ -1,88 +1,36 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.stmt; - -import static com.google.common.base.Preconditions.checkNotNull; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; +package hu.bme.mit.theta.core.stmt -import hu.bme.mit.theta.common.Utils; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.booltype.BoolType; +import hu.bme.mit.theta.common.Utils +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool +import hu.bme.mit.theta.core.type.booltype.BoolType +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable /** - * Assume statement of the form [EXPRESSION], where EXPRESSION is a Boolean {@link Expr}. The + * Assume statement of the form `[EXPRESSION]`, where EXPRESSION is a Boolean [Expr]. The * statement is a guard that can only be passed if EXPRESSION evaluates to true. */ -public final class AssumeStmt implements Stmt { - - private static final int HASH_SEED = 547; - private static final String STMT_LABEL = "assume"; - - private final Expr cond; +@Serializable +@SerialName(AssumeStmt.STMT_LABEL) +data class AssumeStmt(val cond: Expr) : Stmt { - private volatile int hashCode = 0; + companion object { - private AssumeStmt(final Expr cond) { - this.cond = checkNotNull(cond); - } - - public static AssumeStmt of(final Expr cond) { - return new AssumeStmt(cond); - } + internal const val STMT_LABEL = "assume" - public static AssumeStmt create(final Expr cond) { - final Expr newCond = cast(cond, Bool()); - return AssumeStmt.of(newCond); - } + @JvmStatic + fun of(cond: Expr): AssumeStmt = AssumeStmt(cond) - public Expr getCond() { - return cond; - } - - @Override - public R accept(final StmtVisitor visitor, final P param) { - return visitor.visit(this, param); - } - - @Override - public int hashCode() { - int result = hashCode; - if (result == 0) { - result = HASH_SEED; - result = 31 * result + cond.hashCode(); - hashCode = result; + @JvmStatic + fun create(cond: Expr): AssumeStmt { + val newCond = cast(cond, Bool()) + return of(newCond) } - return result; } - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final AssumeStmt that = (AssumeStmt) obj; - return this.getCond().equals(that.getCond()); - } else { - return false; - } - } + override fun accept(visitor: StmtVisitor, param: P): R = visitor.visit(this, param) - @Override - public String toString() { - return Utils.lispStringBuilder(STMT_LABEL).add(cond).toString(); - } + override fun toString(): String = Utils.lispStringBuilder(STMT_LABEL).add(cond).toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/HavocStmt.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/HavocStmt.kt index 106e9e0496..c1a1ecf3a4 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/HavocStmt.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/HavocStmt.kt @@ -1,83 +1,32 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.stmt; +package hu.bme.mit.theta.core.stmt -import static com.google.common.base.Preconditions.checkNotNull; - -import hu.bme.mit.theta.common.Utils; -import hu.bme.mit.theta.core.decl.VarDecl; -import hu.bme.mit.theta.core.type.Type; +import hu.bme.mit.theta.common.Utils +import hu.bme.mit.theta.core.type.Type +import hu.bme.mit.theta.core.decl.VarDecl +import kotlinx.serialization.Serializable +import kotlinx.serialization.SerialName /** - * Havoc statement of the form havoc VARIABLE, which performs a non-deterministic assignment to + * Havoc statement of the form `havoc VARIABLE`, which performs a non-deterministic assignment to * VARIABLE. * * @param */ -public final class HavocStmt implements Stmt { - - private static final int HASH_SEED = 929; - private static final String STMT_LABEL = "havoc"; - - private final VarDecl varDecl; - - private volatile int hashCode = 0; +@Serializable +@SerialName(HavocStmt.STMT_LABEL) +data class HavocStmt( + val varDecl: VarDecl +) : Stmt { - private HavocStmt(final VarDecl varDecl) { - this.varDecl = checkNotNull(varDecl); - } - - public static HavocStmt of(final VarDecl varDecl) { - return new HavocStmt<>(varDecl); - } - - public VarDecl getVarDecl() { - return varDecl; - } + companion object { - @Override - public R accept(final StmtVisitor visitor, final P param) { - return visitor.visit(this, param); - } + internal const val STMT_LABEL = "havoc" - @Override - public int hashCode() { - int result = hashCode; - if (result == 0) { - result = HASH_SEED; - result = 31 * result + varDecl.hashCode(); - hashCode = result; - } - return result; + @JvmStatic + fun of(varDecl: VarDecl): HavocStmt = HavocStmt(varDecl) } - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final HavocStmt that = (HavocStmt) obj; - return this.getVarDecl().equals(that.getVarDecl()); - } else { - return false; - } - } + override fun accept(visitor: StmtVisitor, param: P): R = visitor.visit(this, param) - @Override - public String toString() { - return Utils.lispStringBuilder(STMT_LABEL).add(varDecl.getName()).toString(); - } + override fun toString(): String = Utils.lispStringBuilder(STMT_LABEL).add(varDecl.name).toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/IfStmt.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/IfStmt.kt index 1ae942ce28..6a25d37706 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/IfStmt.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/IfStmt.kt @@ -1,97 +1,35 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. +package hu.bme.mit.theta.core.stmt + +import hu.bme.mit.theta.common.Utils +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.booltype.BoolType +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +/** + * If-then-else statement of the form `if (COND) THEN [else ELSE]`. The statement first evaluates + * the condition COND, and based on its value, executes either the THEN or the ELSE branch. + * The ELSE branch is optional and defaults to a skip statement. */ -package hu.bme.mit.theta.core.stmt; +@Serializable +@SerialName(IfStmt.STMT_LABEL) +data class IfStmt( + val cond: Expr, + val then: Stmt, + val elze: Stmt +) : Stmt { -import static com.google.common.base.Preconditions.checkNotNull; + companion object { + internal const val STMT_LABEL = "if" -import hu.bme.mit.theta.common.Utils; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.booltype.BoolType; + @JvmStatic + fun of(cond: Expr, then: Stmt, elze: Stmt): IfStmt = IfStmt(cond, then, elze) -public class IfStmt implements Stmt { - - private final Expr cond; - private final Stmt then; - private final Stmt elze; - - private static final int HASH_SEED = 361; - private static final String STMT_LABEL = "if"; - - private volatile int hashCode = 0; - - private IfStmt(final Expr cond, final Stmt then, final Stmt elze) { - this.cond = checkNotNull(cond); - this.then = checkNotNull(then); - this.elze = checkNotNull(elze); - } - - public static IfStmt of(final Expr cond, final Stmt then, final Stmt elze) { - return new IfStmt(cond, then, elze); - } - - public static IfStmt of(final Expr cond, final Stmt then) { - return new IfStmt(cond, then, SkipStmt.getInstance()); - } - - @Override - public R accept(final StmtVisitor visitor, final P param) { - return visitor.visit(this, param); + @JvmStatic + fun of(cond: Expr, then: Stmt): IfStmt = IfStmt(cond, then, SkipStmt) } - @Override - public int hashCode() { - int result = hashCode; - if (result == 0) { - result = HASH_SEED; - result = 31 * result + cond.hashCode(); - result = 31 * result + then.hashCode(); - result = 31 * result + elze.hashCode(); - hashCode = result; - } - return result; - } - - public Expr getCond() { - return cond; - } - - public Stmt getThen() { - return then; - } + override fun accept(visitor: StmtVisitor, param: P): R = visitor.visit(this, param) - public Stmt getElze() { - return elze; - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final IfStmt that = (IfStmt) obj; - return this.cond.equals(that.getCond()) - && this.then.equals(that.getThen()) - && this.elze.equals(that.getElze()); - } else { - return false; - } - } - - @Override - public String toString() { - return Utils.lispStringBuilder(STMT_LABEL).add(cond).add(then).add(elze).toString(); - } + override fun toString(): String = Utils.lispStringBuilder(STMT_LABEL).add(cond).add(then).add(elze).toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/LoopStmt.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/LoopStmt.kt index 398f15b928..e1680afc3b 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/LoopStmt.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/LoopStmt.kt @@ -1,112 +1,41 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. +package hu.bme.mit.theta.core.stmt + +import hu.bme.mit.theta.common.Utils +import hu.bme.mit.theta.core.decl.VarDecl +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.inttype.IntType +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +/** + * Loop statement of the form `for (LOOP_VAR = FROM to TO) { BODY }`. The statement executes the + * BODY statement repeatedly, with LOOP_VAR taking on values from FROM to TO (inclusive). */ -package hu.bme.mit.theta.core.stmt; - -import hu.bme.mit.theta.common.Utils; -import hu.bme.mit.theta.core.decl.VarDecl; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.inttype.IntType; - -public final class LoopStmt implements Stmt { - - private final Stmt stmt; - private final VarDecl loopVariable; - private final Expr from; - private final Expr to; - - private static final int HASH_SEED = 361; - private static final String STMT_LABEL = "loop"; - - private volatile int hashCode = 0; - - private LoopStmt( - final Stmt stmt, - final VarDecl loopVariable, - final Expr from, - final Expr to) { - this.stmt = stmt; - this.loopVariable = loopVariable; - this.from = from; - this.to = to; - } - - public static LoopStmt of( - final Stmt stmt, - final VarDecl loopVariable, - final Expr from, - final Expr to) { - return new LoopStmt(stmt, loopVariable, from, to); - } - - public Stmt getStmt() { - return stmt; - } - - public VarDecl getLoopVariable() { - return loopVariable; - } - - public Expr getFrom() { - return from; - } - - public Expr getTo() { - return to; - } - - @Override - public R accept(final StmtVisitor visitor, final P param) { - return visitor.visit(this, param); - } - - @Override - public int hashCode() { - int result = hashCode; - if (result == 0) { - result = HASH_SEED; - result = - 37 * result - + stmt.hashCode() - + loopVariable.hashCode() - + from.hashCode() - + to.hashCode(); - hashCode = result; - } - return result; - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final LoopStmt that = (LoopStmt) obj; - return this.getStmt().equals(that.getStmt()) - && this.loopVariable.equals(that.loopVariable) - && this.from.equals(that.from) - && this.to.equals(that.to); - } else { - return false; - } - } - - @Override - public String toString() { - return Utils.lispStringBuilder(STMT_LABEL) - .add(loopVariable + " from " + from + " to " + to + " " + stmt) - .toString(); - } +@Serializable +@SerialName(LoopStmt.STMT_LABEL) +data class LoopStmt( + val stmt: Stmt, + val loopVariable: VarDecl, + val from: Expr, + val to: Expr +) : Stmt { + + companion object { + internal const val STMT_LABEL = "loop" + + @JvmStatic + fun of( + stmt: Stmt, + loopVar: VarDecl, + from: Expr, + to: Expr + ): LoopStmt = LoopStmt(stmt, loopVar, from, to) + } + + override fun accept(visitor: StmtVisitor, param: P): R = visitor.visit(this, param) + + override fun toString(): String = + Utils.lispStringBuilder(STMT_LABEL) + .add("$loopVariable from $from to $to $stmt") + .toString(); } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/MemoryAssignStmt.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/MemoryAssignStmt.kt index ddbcfd8b88..bc8bd3e172 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/MemoryAssignStmt.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/MemoryAssignStmt.kt @@ -1,98 +1,51 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.stmt; - -import static com.google.common.base.Preconditions.checkNotNull; +package hu.bme.mit.theta.core.stmt -import com.google.common.base.Objects; -import hu.bme.mit.theta.common.Utils; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.Type; -import hu.bme.mit.theta.core.type.anytype.Dereference; +import hu.bme.mit.theta.common.Utils +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.Type +import hu.bme.mit.theta.core.type.anytype.Dereference +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable /** - * Assignment statement of the form *(DEREF_EXPRESSION) := EXPRESSION. The statement updates the + * Assignment statement of the form `*(DEREF_EXPRESSION) := EXPRESSION`. The statement updates the * value pointed to by DEREF_EXPRESSION with the result of EXPRESSION. * - * @param + * @param PtrType The type of the pointer + * @param OffsetType The type of the offset + * @param DeclType The type of the value being assigned */ -public final class MemoryAssignStmt< - PtrType extends Type, OffsetType extends Type, DeclType extends Type> - implements Stmt { - - private static final String STMT_LABEL = "memassign"; - - private final Dereference deref; - private final Expr expr; - - private MemoryAssignStmt( - final Dereference deref, final Expr expr) { - this.deref = checkNotNull(deref); - this.expr = checkNotNull(expr); - } - - public static - MemoryAssignStmt of( - final Dereference deref, - final Expr expr) { - return new MemoryAssignStmt<>(deref, expr); - } - - @SuppressWarnings("unchecked") - public static - MemoryAssignStmt create( - final Dereference deref, final Expr expr) { - final Dereference typedDeref = - (Dereference) deref; - final Expr typedExpr = expr; - return MemoryAssignStmt.of(typedDeref, typedExpr); - } - - public Dereference getDeref() { - return deref; - } - - public Expr getExpr() { - return expr; - } - - @Override - public R accept(final StmtVisitor visitor, final P param) { - return visitor.visit(this, param); - } - - @Override - public int hashCode() { - return Objects.hashCode(deref, expr); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - return Objects.equal(deref, ((MemoryAssignStmt) obj).deref) - && Objects.equal(expr, ((MemoryAssignStmt) obj).expr); - } else { - return false; +@Serializable +@SerialName(MemoryAssignStmt.STMT_LABEL) +data class MemoryAssignStmt( + val deref: Dereference, + val expr: Expr +) : Stmt { + + companion object { + + internal const val STMT_LABEL = "memassign" + + @JvmStatic + fun of( + deref: Dereference, + expr: Expr + ): MemoryAssignStmt = MemoryAssignStmt(deref, expr) + + @JvmStatic + @Suppress("UNCHECKED_CAST") + fun create( + deref: Dereference, + expr: Expr + ): MemoryAssignStmt { + val typedDeref = deref as Dereference + return of(typedDeref, expr) } } - @Override - public String toString() { - return Utils.lispStringBuilder(STMT_LABEL).add(deref).add(expr).toString(); - } + override fun accept(visitor: StmtVisitor, param: P): R = + visitor.visit(this, param) + + override fun toString(): String = + Utils.lispStringBuilder(STMT_LABEL).add(deref).add(expr).toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/NonDetStmt.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/NonDetStmt.kt index a6d074665f..6048a446a6 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/NonDetStmt.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/NonDetStmt.kt @@ -1,79 +1,38 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.stmt; - -import com.google.common.collect.ImmutableList; -import hu.bme.mit.theta.common.Utils; -import java.util.List; - -public final class NonDetStmt implements Stmt { - - private final List stmts; +package hu.bme.mit.theta.core.stmt - private static final int HASH_SEED = 361; - private static final String STMT_LABEL = "nondet"; - - private volatile int hashCode = 0; - - private NonDetStmt(final List stmts) { - if (stmts.isEmpty()) { - this.stmts = ImmutableList.of(SkipStmt.getInstance()); - } else { - this.stmts = stmts; - } - } +import hu.bme.mit.theta.common.Utils +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable - public static NonDetStmt of(final List stmts) { - return new NonDetStmt(stmts); +/** + * Non-deterministic statement of the form `nondet { STMT1, STMT2, ... }`. The statement executes + * exactly one of the given statements, chosen non-deterministically. + */ +@Serializable +@SerialName(NonDetStmt.STMT_LABEL) +data class NonDetStmt( + val stmts: List +) : Stmt { + + init { + check(stmts.isNotEmpty()) } - public List getStmts() { - return stmts; - } + companion object { - @Override - public R accept(final StmtVisitor visitor, final P param) { - return visitor.visit(this, param); - } + internal const val STMT_LABEL = "nondet" - @Override - public int hashCode() { - int result = hashCode; - if (result == 0) { - result = HASH_SEED; - result = 31 * result + stmts.hashCode(); - hashCode = result; + @JvmStatic + fun of(stmts: List): NonDetStmt { + val stmtList = stmts.ifEmpty { + listOf(SkipStmt) + } + return NonDetStmt(stmtList) } - return result; } - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final NonDetStmt that = (NonDetStmt) obj; - return this.getStmts().equals(that.getStmts()); - } else { - return false; - } - } + override fun accept(visitor: StmtVisitor, param: P): R = + visitor.visit(this, param) - @Override - public String toString() { - return Utils.lispStringBuilder(STMT_LABEL).addAll(stmts).toString(); - } + override fun toString(): String = Utils.lispStringBuilder(STMT_LABEL).addAll(stmts).toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/OrtStmt.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/OrtStmt.kt index 2e79eec0fd..8a9fe1c3ee 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/OrtStmt.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/OrtStmt.kt @@ -1,79 +1,38 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.stmt; - -import com.google.common.collect.ImmutableList; -import hu.bme.mit.theta.common.Utils; -import java.util.List; - -public final class OrtStmt implements Stmt { - - private final List stmts; +package hu.bme.mit.theta.core.stmt - private static final int HASH_SEED = 241; - private static final String STMT_LABEL = "ort"; - - private volatile int hashCode = 0; - - private OrtStmt(final List stmts) { - if (stmts.isEmpty()) { - this.stmts = ImmutableList.of(SkipStmt.getInstance()); - } else { - this.stmts = stmts; - } - } +import hu.bme.mit.theta.common.Utils +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable - public static OrtStmt of(final List stmts) { - return new OrtStmt(stmts); +/** + * Orthogonal statement of the form `ort { STMT1, STMT2, ... }`. The statement executes all of the + * given statements in parallel. + */ +@Serializable +@SerialName(OrtStmt.STMT_LABEL) +data class OrtStmt( + val stmts: List +) : Stmt { + + init { + check(stmts.isNotEmpty()) } - public List getStmts() { - return stmts; - } + companion object { - @Override - public R accept(final StmtVisitor visitor, final P param) { - return visitor.visit(this, param); - } + internal const val STMT_LABEL = "ort" - @Override - public int hashCode() { - int result = hashCode; - if (result == 0) { - result = HASH_SEED; - result = 62 * result + stmts.hashCode(); - hashCode = result; + @JvmStatic + fun of(stmts: List): OrtStmt { + val stmtList = stmts.ifEmpty { + listOf(SkipStmt) + } + return OrtStmt(stmtList) } - return result; } - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final OrtStmt that = (OrtStmt) obj; - return this.getStmts().equals(that.getStmts()); - } else { - return false; - } - } + override fun accept(visitor: StmtVisitor, param: P): R = + visitor.visit(this, param) - @Override - public String toString() { - return Utils.lispStringBuilder(STMT_LABEL).addAll(stmts).toString(); - } + override fun toString(): String = Utils.lispStringBuilder(STMT_LABEL).addAll(stmts).toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/SequenceStmt.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/SequenceStmt.kt index 22fc264288..7d54fdd2a5 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/SequenceStmt.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/SequenceStmt.kt @@ -1,78 +1,38 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.stmt; - -import com.google.common.collect.ImmutableList; -import hu.bme.mit.theta.common.Utils; -import java.util.List; - -public final class SequenceStmt implements Stmt { - - private final List stmts; +package hu.bme.mit.theta.core.stmt - private static final int HASH_SEED = 241; - - private volatile int hashCode = 0; - - private SequenceStmt(final List stmts) { - if (stmts.isEmpty()) { - this.stmts = ImmutableList.of(SkipStmt.getInstance()); - } else { - this.stmts = stmts; - } - } +import hu.bme.mit.theta.common.Utils +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable - public static SequenceStmt of(final List stmts) { - return new SequenceStmt(stmts); +/** + * Sequence statement of the form `sequence { STMT1; STMT2; ... }`. The statement executes all of the + * given statements in sequence. + */ +@Serializable +@SerialName(SequenceStmt.STMT_LABEL) +data class SequenceStmt( + val stmts: List +) : Stmt { + + init { + check(stmts.isNotEmpty()) } - public List getStmts() { - return stmts; - } + companion object { - @Override - public R accept(final StmtVisitor visitor, final P param) { - return visitor.visit(this, param); - } + internal const val STMT_LABEL = "sequence" - @Override - public int hashCode() { - int result = hashCode; - if (result == 0) { - result = HASH_SEED; - result = 31 * result + stmts.hashCode(); - hashCode = result; + @JvmStatic + fun of(stmts: List): SequenceStmt { + val stmtList = stmts.ifEmpty { + listOf(SkipStmt) + } + return SequenceStmt(stmtList) } - return result; } - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final SequenceStmt that = (SequenceStmt) obj; - return this.getStmts().equals(that.getStmts()); - } else { - return false; - } - } + override fun accept(visitor: StmtVisitor, param: P): R = + visitor.visit(this, param) - @Override - public String toString() { - return Utils.lispStringBuilder().addAll(stmts).toString(); - } + override fun toString(): String = Utils.lispStringBuilder().addAll(stmts).toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/SkipStmt.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/SkipStmt.kt index 0336c5310f..0dcdeafda0 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/SkipStmt.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/SkipStmt.kt @@ -1,60 +1,16 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.stmt; +package hu.bme.mit.theta.core.stmt -/** A skip statement is a placeholder that does not perform any operation. */ -public final class SkipStmt implements Stmt { +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable - private static final int HASH_CODE = 1310147; - private static final String STMT_LABEL = "skip"; +@Serializable +@SerialName(SkipStmt.STMT_LABEL) +data object SkipStmt : Stmt { + internal const val STMT_LABEL = "skip" - private SkipStmt() {} - - private static class LazyHolder { - - static final SkipStmt INSTANCE = new SkipStmt(); - } - - public static SkipStmt getInstance() { - return LazyHolder.INSTANCE; - } - - @Override - public R accept(final StmtVisitor visitor, final P param) { - return visitor.visit(this, param); - } - - @Override - public int hashCode() { - return HASH_CODE; - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj == null) { - return false; - } else { - return obj != null && this.getClass() == obj.getClass(); - } - } - - @Override - public String toString() { - return STMT_LABEL; + override fun accept(visitor: StmtVisitor, param: P): R { + return visitor.visit(this, param) } + + override fun toString(): String = STMT_LABEL } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/Stmt.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/Stmt.kt index 3c396ebd1b..0c01db3923 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/Stmt.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/Stmt.kt @@ -1,21 +1,18 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.stmt; +package hu.bme.mit.theta.core.stmt -public interface Stmt { +import kotlinx.serialization.Polymorphic - R accept(StmtVisitor visitor, P param); +/** + * Base class for all statements in the Theta framework. + * All subclasses must be serializable. + */ +@Polymorphic +interface Stmt { + /** + * Accepts a visitor and returns the result of the visit. + * @param visitor The visitor to accept + * @param param Additional parameter for the visitor + * @return The result of the visit + */ + fun accept(visitor: StmtVisitor, param: P): R } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/StmtVisitor.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/StmtVisitor.kt index ce9ca2185d..7e0cd39462 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/StmtVisitor.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/StmtVisitor.kt @@ -1,42 +1,25 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.stmt; - -import hu.bme.mit.theta.core.type.Type; - -public interface StmtVisitor { - - R visit(SkipStmt stmt, P param); - - R visit(AssumeStmt stmt, P param); - - R visit(AssignStmt stmt, P param); +package hu.bme.mit.theta.core.stmt - R visit( - MemoryAssignStmt stmt, P param); +import hu.bme.mit.theta.core.type.Type - R visit(HavocStmt stmt, P param); - - R visit(SequenceStmt stmt, P param); - - R visit(NonDetStmt stmt, P param); - - R visit(OrtStmt stmt, P param); - - R visit(LoopStmt stmt, P param); - - R visit(IfStmt stmt, P param); +/** + * Visitor interface for the statement hierarchy. + * @param

The type of the parameter + * @param The return type of the visit operations + */ +interface StmtVisitor { + fun visit(stmt: SkipStmt, param: P): R + fun visit(stmt: AssumeStmt, param: P): R + fun visit(stmt: AssignStmt, param: P): R + fun visit( + stmt: MemoryAssignStmt, + param: P + ): R + + fun visit(stmt: HavocStmt, param: P): R + fun visit(stmt: SequenceStmt, param: P): R + fun visit(stmt: NonDetStmt, param: P): R + fun visit(stmt: OrtStmt, param: P): R + fun visit(stmt: LoopStmt, param: P): R + fun visit(stmt: IfStmt, param: P): R } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/Stmts.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/Stmts.kt index 818cb605db..17e7a983fd 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/Stmts.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/Stmts.kt @@ -1,63 +1,48 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.stmt; +package hu.bme.mit.theta.core.stmt -import hu.bme.mit.theta.core.decl.VarDecl; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.Type; -import hu.bme.mit.theta.core.type.anytype.Dereference; -import hu.bme.mit.theta.core.type.booltype.BoolType; -import java.util.List; +import hu.bme.mit.theta.core.decl.VarDecl +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.Type +import hu.bme.mit.theta.core.type.anytype.Dereference +import hu.bme.mit.theta.core.type.booltype.BoolType /** * Factory class to instantiate different statements. * * @see Stmt */ -public final class Stmts { - - private Stmts() {} - - public static SkipStmt Skip() { - return SkipStmt.getInstance(); - } - - public static AssumeStmt Assume(final Expr cond) { - return AssumeStmt.of(cond); - } - - public static AssignStmt Assign(final VarDecl lhs, final Expr rhs) { - return AssignStmt.of(lhs, rhs); - } - - public static

- MemoryAssignStmt MemoryAssign( - final Dereference deref, final Expr expr) { - return MemoryAssignStmt.of(deref, expr); - } - - public static HavocStmt Havoc(final VarDecl varDecl) { - return HavocStmt.of(varDecl); - } - - public static SequenceStmt SequenceStmt(final List stmts) { - return SequenceStmt.of(stmts); - } - - public static NonDetStmt NonDetStmt(final List stmts) { - return NonDetStmt.of(stmts); - } +object Stmts { + + /** Create a skip statement */ + @JvmStatic + fun Skip(): SkipStmt = SkipStmt + + /** Create an assume statement */ + @JvmStatic + fun Assume(cond: Expr): AssumeStmt = AssumeStmt(cond) + + /** Create an assignment statement */ + @JvmStatic + fun Assign( + lhs: VarDecl, + rhs: Expr + ): AssignStmt = AssignStmt.of(lhs, rhs) + + /** Create a memory assignment statement */ + fun

MemoryAssign( + deref: Dereference, + expr: Expr + ): MemoryAssignStmt = MemoryAssignStmt.of(deref, expr) + + /** Create a havoc statement */ + @JvmStatic + fun Havoc(varDecl: VarDecl): HavocStmt = HavocStmt.of(varDecl) + + /** Create a sequence statement */ + @JvmStatic + fun Sequence(stmts: List): SequenceStmt = SequenceStmt.of(stmts) + + /** Create a non-deterministic choice statement */ + @JvmStatic + fun NonDet(stmts: List): NonDetStmt = NonDetStmt.of(stmts) } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/BinaryExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/BinaryExpr.kt index 8a0ca0fa2e..b57c3ff791 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/BinaryExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/BinaryExpr.kt @@ -13,86 +13,49 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type; +package hu.bme.mit.theta.core.type -import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.base.Preconditions.checkNotNull; +import hu.bme.mit.theta.common.Utils +import hu.bme.mit.theta.core.utils.TypeUtils +import kotlinx.serialization.Serializable -import com.google.common.collect.ImmutableList; -import hu.bme.mit.theta.common.Utils; -import hu.bme.mit.theta.core.utils.TypeUtils; -import java.util.List; - -public abstract class BinaryExpr - implements Expr { - - private final Expr leftOp; - private final Expr rightOp; - - private volatile int hashCode = 0; - - protected BinaryExpr(final Expr leftOp, final Expr rightOp) { - this.leftOp = checkNotNull(leftOp); - this.rightOp = checkNotNull(rightOp); - } - - public final Expr getLeftOp() { - return leftOp; - } - - public final Expr getRightOp() { - return rightOp; - } +/** + * Base class for expressions with two operands (binary expressions). + * + * @param OpType The type of the operands + * @param ExprType The type of the expression + */ +@Serializable +abstract class BinaryExpr : Expr { - @Override - public final int getArity() { - return 2; - } + protected abstract val leftOp: Expr + protected abstract val rightOp: Expr - @Override - public final List> getOps() { - return ImmutableList.of(leftOp, rightOp); - } + override val arity: Int get() = 2 - @Override - public final BinaryExpr withOps(final List> ops) { - checkNotNull(ops); - checkArgument(ops.size() == 2); - final OpType opType = getLeftOp().getType(); - final Expr newLeftOp = TypeUtils.cast(ops.get(0), opType); - final Expr newRightOp = TypeUtils.cast(ops.get(1), opType); - return with(newLeftOp, newRightOp); - } + override val ops: List> get() = listOf(leftOp, rightOp) - @Override - public final int hashCode() { - int result = hashCode; - if (result == 0) { - result = getHashSeed(); - result = 31 * result + getLeftOp().hashCode(); - result = 31 * result + getRightOp().hashCode(); - hashCode = result; - } - return result; + override fun withOps(ops: List>): Expr { + require(ops.size == 2) { "Operands must have size 2 for binary expression" } + val opType = leftOp.type + val newLeftOp = TypeUtils.cast(ops[0], opType) + val newRightOp = TypeUtils.cast(ops[1], opType) + return with(newLeftOp, newRightOp) } - @Override - public final String toString() { + override fun toString(): String { return Utils.lispStringBuilder(getOperatorLabel()) - .body() - .add(leftOp) - .add(rightOp) - .toString(); + .body() + .add(leftOp) + .add(rightOp) + .toString() } - public abstract BinaryExpr with( - final Expr leftOp, final Expr rightOp); - - public abstract BinaryExpr withLeftOp(final Expr leftOp); + abstract fun with(leftOp: Expr, rightOp: Expr): BinaryExpr - public abstract BinaryExpr withRightOp(final Expr rightOp); + abstract fun withLeftOp(leftOp: Expr): BinaryExpr - protected abstract int getHashSeed(); + abstract fun withRightOp(rightOp: Expr): BinaryExpr - public abstract String getOperatorLabel(); + abstract fun getOperatorLabel(): String } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/Expr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/Expr.kt index 046581d89e..49bdab4328 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/Expr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/Expr.kt @@ -13,36 +13,61 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type; +package hu.bme.mit.theta.core.type -import static com.google.common.collect.ImmutableList.toImmutableList; +import hu.bme.mit.theta.core.model.Valuation +import kotlinx.serialization.Polymorphic +import kotlinx.serialization.Serializable -import hu.bme.mit.theta.core.model.Valuation; -import java.util.List; -import java.util.function.Function; - -public interface Expr { +/** + * Base class for all expressions in the Theta framework. + * + * @param ExprType The type of the expression, must be a subtype of [Type] + */ +@Polymorphic +interface Expr { - int getArity(); + /** + * Returns the arity (number of operands) of this expression. + */ + val arity: Int - ExprType getType(); + /** + * Returns the type of this expression. + */ + val type: ExprType - LitExpr eval(Valuation val); + /** + * Returns the list of operands of this expression. + */ + val ops: List> - List> getOps(); + /** + * Evaluates this expression with the given valuation. + * @param val The valuation to use for evaluation + * @return The result of the evaluation as a literal expression + */ + fun eval(`val`: Valuation): LitExpr - default boolean isInvalid() { - for (var op : getOps()) { - if (op.isInvalid()) { - return true; - } - } - return false; - } + /** + * Checks if this expression is invalid. + * An expression is invalid if any of its operands are invalid. + */ + val isInvalid: Boolean + get() = ops.any { it.isInvalid } - Expr withOps(List> ops); + /** + * Creates a new expression of the same type with the given operands. + * @param ops The new operands + * @return A new expression with the given operands + */ + fun withOps(ops: List>): Expr - default Expr map(final Function, ? extends Expr> function) { - return withOps(getOps().stream().map(function::apply).collect(toImmutableList())); - } + /** + * Applies the given function to each operand of this expression and returns a new expression + * with the results. + * @param function The function to apply to each operand + * @return A new expression with the transformed operands + */ + fun map(function: (Expr<*>) -> Expr<*>): Expr = withOps(ops.map(function)) } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/LitExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/LitExpr.kt index 153f01977c..16a5fc9090 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/LitExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/LitExpr.kt @@ -13,6 +13,16 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type; +package hu.bme.mit.theta.core.type -public interface LitExpr extends Expr {} +import hu.bme.mit.theta.core.model.Valuation +import kotlinx.serialization.Polymorphic +import kotlinx.serialization.Serializable + +/** + * Interface for literal expressions (constants). + * + * @param ExprType The type of the literal, must be a subtype of [Type] + */ +@Polymorphic +interface LitExpr : Expr diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/MultiaryExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/MultiaryExpr.kt index d30e2c176e..bb78a53b51 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/MultiaryExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/MultiaryExpr.kt @@ -13,70 +13,39 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type; +package hu.bme.mit.theta.core.type -import static com.google.common.base.Preconditions.checkNotNull; -import static com.google.common.collect.ImmutableList.toImmutableList; +import hu.bme.mit.theta.common.Utils +import hu.bme.mit.theta.core.utils.TypeUtils +import kotlinx.serialization.Serializable -import com.google.common.collect.ImmutableList; -import hu.bme.mit.theta.common.Utils; -import hu.bme.mit.theta.core.utils.TypeUtils; -import java.util.List; - -public abstract class MultiaryExpr - implements Expr { - - private final List> ops; - - private volatile int hashCode = 0; - - protected MultiaryExpr(final Iterable> ops) { - checkNotNull(ops); - this.ops = ImmutableList.copyOf(ops); - } +/** + * Base class for expressions with multiple operands of the same type. + * + * @param OpType The type of the operands + * @param ExprType The type of the expression + */ +@Serializable +abstract class MultiaryExpr : Expr { - @Override - public final int getArity() { - return ops.size(); - } + abstract override val ops: List> - @Override - public final List> getOps() { - return ops; - } + override val arity: Int + get() = ops.size - @Override - public MultiaryExpr withOps(final List> ops) { - checkNotNull(ops); + override fun withOps(ops: List>): MultiaryExpr { if (ops.isEmpty()) { - return with(ImmutableList.of()); + return with(listOf()) } else { - final OpType opType = getOps().get(0).getType(); - final List> newOps = - ops.stream().map(op -> TypeUtils.cast(op, opType)).collect(toImmutableList()); - return with(newOps); + val opType: OpType = this.ops[0].type + val newOps: List> = ops.map { op: Expr<*> -> TypeUtils.cast(op, opType) } + return with(newOps) } } - @Override - public final int hashCode() { - int result = hashCode; - if (result == 0) { - result = getHashSeed(); - result = 31 * result + getOps().hashCode(); - hashCode = result; - } - return result; - } - - @Override - public final String toString() { - return Utils.lispStringBuilder(getOperatorLabel()).body().addAll(ops).toString(); - } - - public abstract MultiaryExpr with(final Iterable> ops); + override fun toString(): String = Utils.lispStringBuilder(getOperatorLabel()).body().addAll(ops).toString() - protected abstract int getHashSeed(); + abstract fun with(ops: Iterable>): MultiaryExpr - public abstract String getOperatorLabel(); + abstract fun getOperatorLabel(): String } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/NullaryExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/NullaryExpr.kt index e1d686b6a8..61f7ba9a0d 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/NullaryExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/NullaryExpr.kt @@ -13,30 +13,24 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type; +package hu.bme.mit.theta.core.type -import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.base.Preconditions.checkNotNull; +import kotlinx.serialization.Serializable -import com.google.common.collect.ImmutableList; -import java.util.List; - -public abstract class NullaryExpr implements Expr { - - @Override - public final List> getOps() { - return ImmutableList.of(); - } - - @Override - public final NullaryExpr withOps(final List> ops) { - checkNotNull(ops); - checkArgument(ops.isEmpty()); - return this; - } +/** + * Base class for expressions with no operands (nullary expressions). + * + * @param ExprType The type of the expression, must be a subtype of [Type] + */ +@Serializable +abstract class NullaryExpr : Expr { + override val arity: Int get() = 0 + + override val ops: List> + get() = emptyList() - @Override - public final int getArity() { - return 0; + override fun withOps(ops: List>): Expr { + require(ops.isEmpty()) { "Operands must be empty for nullary expression" } + return this } } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/Type.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/Type.kt index b3b5934fd8..de2967d69d 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/Type.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/Type.kt @@ -13,8 +13,19 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type; +package hu.bme.mit.theta.core.type -public interface Type { - DomainSize getDomainSize(); +import kotlinx.serialization.Polymorphic + +/** + * Base class for all types in the Theta framework. + * Represents the type of expressions and variables. + */ +@Polymorphic +interface Type { + /** + * Returns the size of the domain of this type. + * @return The domain size of this type + */ + val domainSize: DomainSize } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/UnaryExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/UnaryExpr.kt index 0d32e7e1f7..59190aac6a 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/UnaryExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/UnaryExpr.kt @@ -13,69 +13,38 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type; +package hu.bme.mit.theta.core.type -import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.base.Preconditions.checkNotNull; +import hu.bme.mit.theta.common.Utils +import hu.bme.mit.theta.core.utils.TypeUtils +import kotlinx.serialization.Serializable -import com.google.common.collect.ImmutableList; -import hu.bme.mit.theta.common.Utils; -import hu.bme.mit.theta.core.utils.TypeUtils; -import java.util.List; - -public abstract class UnaryExpr - implements Expr { - - private final Expr op; - - private volatile int hashCode = 0; - - public UnaryExpr(final Expr op) { - this.op = checkNotNull(op); - } - - public final Expr getOp() { - return op; - } +/** + * Base class for expressions with a single operand (unary expressions). + * + * @param ExprType The type of the expression, must be a subtype of [Type] + * @param OpType The type of the operand + */ +@Serializable +abstract class UnaryExpr : Expr { - @Override - public final List> getOps() { - return ImmutableList.of(op); - } + abstract val op: Expr - @Override - public final UnaryExpr withOps(final List> ops) { - checkNotNull(ops); - checkArgument(ops.size() == 1); - final OpType opType = op.getType(); - final Expr newOp = TypeUtils.cast(ops.get(0), opType); - return with(newOp); - } + override val arity: Int get() = 1 - @Override - public int getArity() { - return 1; - } - - @Override - public final int hashCode() { - int result = hashCode; - if (result == 0) { - result = getHashSeed(); - result = 37 * result + getOp().hashCode(); - hashCode = result; - } - return result; - } + override val ops: List> + get() = listOf(op) - @Override - public final String toString() { - return Utils.lispStringBuilder(getOperatorLabel()).body().add(op).toString(); + override fun withOps(ops: List>): Expr { + require(ops.size == 1) { "Operands must have size 1 for unary expression" } + val opType = op.type + val newOp = TypeUtils.cast(ops[0], opType) + return with(newOp) } - public abstract UnaryExpr with(final Expr op); + override fun toString(): String = Utils.lispStringBuilder(operatorLabel).body().add(op).toString() - protected abstract int getHashSeed(); + abstract fun with(op: Expr): UnaryExpr - public abstract String getOperatorLabel(); + protected abstract val operatorLabel: String } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/AddExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/AddExpr.kt index 56e801acff..4995dc0be8 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/AddExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/AddExpr.kt @@ -13,28 +13,26 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.abstracttype; +package hu.bme.mit.theta.core.type.abstracttype -import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.collect.ImmutableList.toImmutableList; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.MultiaryExpr +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.Serializable -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.MultiaryExpr; -import java.util.List; - -public abstract class AddExpr> - extends MultiaryExpr { +/** + * Abstract class for additive expressions with multiple operands. + */ +@Serializable +abstract class AddExpr> : MultiaryExpr() { - protected AddExpr(final Iterable> ops) { - super(ops); - } + companion object { - public static > AddExpr create2( - final List> ops) { - checkArgument(!ops.isEmpty()); - @SuppressWarnings("unchecked") - final ExprType type = (ExprType) ops.get(0).getType(); - return type.Add(ops.stream().map(op -> cast(op, type)).collect(toImmutableList())); + fun > create2(ops: List>): AddExpr<*> { + require(ops.isNotEmpty()) + @Suppress("UNCHECKED_CAST") + val type = ops[0].type as ExprType + return type.Add(ops.map { cast(it, type) }) + } } } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Additive.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Additive.kt index 0035f620f7..22d578818d 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Additive.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Additive.kt @@ -13,18 +13,19 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.abstracttype; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.Type; +package hu.bme.mit.theta.core.type.abstracttype -public interface Additive> extends Type { +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.Type - AddExpr Add(Iterable> ops); +abstract class Additive> : Type() { - SubExpr Sub(Expr leftOp, Expr rightOp); + abstract fun Add(ops: Iterable>): AddExpr - PosExpr Pos(Expr op); + abstract fun Sub(leftOp: Expr, rightOp: Expr): SubExpr - NegExpr Neg(Expr op); + abstract fun Pos(op: Expr): PosExpr + + abstract fun Neg(op: Expr): NegExpr } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/CastExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/CastExpr.kt index 65ec3fb7d7..5d71a558e9 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/CastExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/CastExpr.kt @@ -13,16 +13,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.abstracttype; +package hu.bme.mit.theta.core.type.abstracttype -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.Type; -import hu.bme.mit.theta.core.type.UnaryExpr; +import hu.bme.mit.theta.core.type.Type +import hu.bme.mit.theta.core.type.UnaryExpr +import kotlinx.serialization.Serializable -public abstract class CastExpr, TargetType extends Type> - extends UnaryExpr { +/** + * Abstract class for cast expressions with a single operand. + */ +@Serializable +abstract class CastExpr, TargetType : Type> : UnaryExpr() - public CastExpr(final Expr op) { - super(op); - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Castable.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Castable.kt index 73841e3762..3b5a6bdef2 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Castable.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Castable.kt @@ -13,12 +13,19 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.abstracttype; +package hu.bme.mit.theta.core.type.abstracttype -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.Type; +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.Type +import kotlinx.serialization.Polymorphic -public interface Castable> extends Type { +/** + * Interface for types that support casting operations. + * + * @param SourceType The source type that can be cast from + */ +@Polymorphic +interface Castable> : Type { - Expr Cast(Expr op, final TargetType type); + fun Cast(op: Expr, type: TargetType): Expr } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/Dereference.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/Dereference.kt index 57ab22b884..7ad7b3fa0a 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/Dereference.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/Dereference.kt @@ -13,122 +13,80 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.anytype; - -import static com.google.common.base.Preconditions.checkState; - -import hu.bme.mit.theta.common.Utils; -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.type.Type; -import hu.bme.mit.theta.core.type.inttype.IntType; -import java.util.List; -import java.util.Objects; -import java.util.Optional; - -public final class Dereference implements Expr { - - private static final String OPERATOR_LABEL = "deref"; - private final Expr array; - private final Expr offset; - private final T type; - - private final Optional> uniquenessIdx; - - private Dereference(Expr array, Expr offset, T type) { - this.array = array; - this.offset = offset; - this.type = type; - uniquenessIdx = Optional.empty(); - } - - private Dereference(Expr array, Expr offset, Expr uniqueness, T type) { - this.array = array; - this.offset = offset; - this.type = type; - this.uniquenessIdx = Optional.ofNullable(uniqueness); - } - - public Expr getArray() { - return array; - } - - public Expr getOffset() { - return offset; - } - - public static Dereference of( - Expr array, Expr offset, T type) { - return new Dereference<>(array, offset, type); - } - - private static Dereference of( - Expr array, Expr offset, Expr uniqueness, T type) { - return new Dereference<>(array, offset, uniqueness, type); - } - - public Dereference withUniquenessExpr(Expr expr) { - return Dereference.of(array, offset, expr, type); // TODO: this kills the stuck check - } - - @Override - public int getArity() { - return 3; - } - - @Override - public T getType() { - return type; - } - - @Override - public LitExpr eval(Valuation val) { - throw new IllegalStateException( - "Reference/Dereference expressions are not meant to be evaluated!"); - } - - @Override - public List> getOps() { - return uniquenessIdx.isPresent() - ? List.of(array, offset, uniquenessIdx.get()) - : List.of(array, offset); - } - - @Override - public Expr withOps(List> ops) { - checkState(ops.size() == 3 || ops.size() == 2); - if (ops.size() == 3) { - return Dereference.of(ops.get(0), ops.get(1), (Expr) ops.get(2), type); - } else { - return Dereference.of(ops.get(0), ops.get(1), type); - } - } - - @Override - public int hashCode() { - return Objects.hash(array, offset, uniquenessIdx, type); - } - - @Override - public boolean equals(Object obj) { - if (obj instanceof Dereference that) { - return Objects.equals(this.array, that.array) - && Objects.equals(this.offset, that.offset) - && Objects.equals(this.uniquenessIdx, that.uniquenessIdx) - && Objects.equals(this.type, that.type); +package hu.bme.mit.theta.core.type.anytype + +import hu.bme.mit.theta.common.Utils +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.type.Type +import hu.bme.mit.theta.core.type.inttype.IntType +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +/** + * Represents a dereference expression for array access. + * + * @param A The array type + * @param O The offset type + * @param T The element type + * @property array The array expression + * @property offset The offset expression + * @property type The type of the dereferenced element + * @property uniquenessIdx Optional uniqueness index for SMT encoding + */ +@Serializable +@SerialName(Dereference.OPERATOR_LABEL) +data class Dereference( + val array: Expr, + val offset: Expr, + override val type: T, + val uniquenessIdx: Expr? = null +) : Expr { + + companion object { + + internal const val OPERATOR_LABEL = "deref" + + fun of( + array: Expr, + offset: Expr, + type: T + ): Dereference = Dereference(array, offset, type) + + private fun of( + array: Expr, + offset: Expr, + uniqueness: Expr, + type: T + ): Dereference = Dereference(array, offset, type, uniqueness) + } + + fun withUniquenessExpr(expr: Expr): Dereference = + of(array, offset, expr, type) + + override val arity: Int = 3 + + override val ops: List> = + if (uniquenessIdx != null) listOf(array, offset, uniquenessIdx) + else listOf(array, offset) + + override fun eval(`val` : Valuation): LitExpr = + throw IllegalStateException("Reference/Dereference expressions are not meant to be evaluated!") + + @Suppress("UNCHECKED_CAST") + override fun withOps(ops: List>): Expr { + require(ops.size == 2 || ops.size == 3) { "Dereference must have 2 or 3 operands" } + return when (ops.size) { + 2 -> of(ops[0] as Expr, ops[1] as Expr, type) + else -> of(ops[0] as Expr, ops[1] as Expr, ops[2] as Expr, type) } - return false; - } - - @Override - public String toString() { - var base = Utils.lispStringBuilder(OPERATOR_LABEL).body().add(getArray()).add(getOffset()); - uniquenessIdx.ifPresent(base::add); - return base.add(type).toString(); } - public Optional> getUniquenessIdx() { - return uniquenessIdx; - } + override fun toString(): String = + Utils.lispStringBuilder(OPERATOR_LABEL) + .body() + .addAll(ops) + .add(type) + .toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/InvalidLitExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/InvalidLitExpr.kt index d9aef00d67..bf90d9f3d2 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/InvalidLitExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/InvalidLitExpr.kt @@ -13,40 +13,29 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.anytype; +package hu.bme.mit.theta.core.type.anytype -import com.google.common.base.Preconditions; -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.type.NullaryExpr; -import hu.bme.mit.theta.core.type.Type; +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.type.NullaryExpr +import hu.bme.mit.theta.core.type.Type +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -public class InvalidLitExpr extends NullaryExpr - implements LitExpr { - - private final ExprType type; - - public InvalidLitExpr(ExprType type) { - this.type = Preconditions.checkNotNull(type); - } - - @Override - public ExprType getType() { - return type; - } +/** + * Represents an invalid literal expression. + * + * @param ExprType The type of the expression + */ +@Serializable +@SerialName("InvalidLit") +data class InvalidLitExpr( + override val type: ExprType +) : NullaryExpr(), LitExpr { - @Override - public LitExpr eval(Valuation val) { - return this; - } + override fun eval(`val`: Valuation): LitExpr = this - @Override - public boolean isInvalid() { - return true; - } + override val isInvalid: Boolean = true - @Override - public boolean equals(Object obj) { - return false; - } + override fun equals(other: Any?): Boolean = false } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/IteExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/IteExpr.kt index 9857c29003..9143fe6f99 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/IteExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/IteExpr.kt @@ -13,158 +13,96 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.anytype; - -import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.base.Preconditions.checkNotNull; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import com.google.common.collect.ImmutableList; -import hu.bme.mit.theta.common.Utils; -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.type.Type; -import hu.bme.mit.theta.core.type.booltype.BoolLitExpr; -import hu.bme.mit.theta.core.type.booltype.BoolType; -import java.util.List; - -public final class IteExpr implements Expr { - - private static final int HASH_SEED = 181; - private static final String OPERATOR_LABEL = "ite"; - - private final Expr cond; - private final Expr then; - private final Expr elze; - - private volatile int hashCode = 0; - - private IteExpr( - final Expr cond, final Expr then, final Expr elze) { - this.cond = checkNotNull(cond); - this.then = checkNotNull(then); - this.elze = checkNotNull(elze); - } - - public static IteExpr of( - final Expr cond, final Expr then, final Expr elze) { - return new IteExpr<>(cond, then, elze); - } - - public static IteExpr create( - final Expr cond, final Expr then, final Expr elze) { - final Expr newCond = cast(cond, Bool()); - @SuppressWarnings("unchecked") - final Expr newThen = (Expr) then; - final Expr newElze = cast(elze, newThen.getType()); - return IteExpr.of(newCond, newThen, newElze); - } - - public Expr getCond() { - return cond; - } - - public Expr getThen() { - return then; +package hu.bme.mit.theta.core.type.anytype + +import hu.bme.mit.theta.common.Utils +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.type.Type +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool +import hu.bme.mit.theta.core.type.booltype.BoolLitExpr +import hu.bme.mit.theta.core.type.booltype.BoolType +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +/** + * Represents an if-then-else expression. + * + * @param ExprType The type of the expression + */ +@Serializable +@SerialName(IteExpr.OPERATOR_LABEL) +data class IteExpr( + val cond: Expr, + val then: Expr, + val elze: Expr +) : Expr { + + companion object { + + internal const val OPERATOR_LABEL = "ite" + + @JvmStatic + fun of( + cond: Expr, + then: Expr, + elze: Expr + ): IteExpr = IteExpr(cond, then, elze) + + @JvmStatic + fun create( + cond: Expr<*>, + then: Expr<*>, + elze: Expr<*> + ): IteExpr { + val newCond = cast(cond, Bool()) + + @Suppress("UNCHECKED_CAST") + val newThen = then as Expr + val newElze = cast(elze, newThen.type) + return of(newCond, newThen, newElze) + } } - public Expr getElse() { - return elze; - } + override val type: ExprType = then.type - @Override - public List> getOps() { - return ImmutableList.of(cond, then, elze); - } + override val arity: Int = 3 - @Override - public int getArity() { - return 3; - } + override val ops: List> = listOf(cond, then, elze) - @Override - public ExprType getType() { - return getThen().getType(); - } - - @Override - public LitExpr eval(final Valuation val) { - final BoolLitExpr condVal = (BoolLitExpr) cond.eval(val); - if (condVal.getValue()) { - return then.eval(val); + override fun eval(`val`: Valuation): LitExpr = + if ((cond.eval(`val`) as BoolLitExpr).value) { + then.eval(`val`) } else { - return elze.eval(val); + elze.eval(`val`) } - } - @Override - public IteExpr withOps(final List> ops) { - checkNotNull(ops); - checkArgument(ops.size() == 3); - final ExprType exprType = getType(); - final Expr newCond = cast(ops.get(0), Bool()); - final Expr newThen = cast(ops.get(1), exprType); - final Expr newElze = cast(ops.get(2), exprType); - return with(newCond, newThen, newElze); + override fun withOps(ops: List>): IteExpr { + require(ops.size == 3) { "Operands must have size 3 for Ite expression" } + val newCond = cast(ops[0], Bool()) + val newThen = cast(ops[1], type) + val newElze = cast(ops[2], type) + return with(newCond, newThen, newElze) } - public IteExpr with( - final Expr cond, final Expr then, final Expr elze) { - if (this.cond == cond && this.then == then && this.elze == elze) { - return this; + fun with(cond: Expr, then: Expr, elze: Expr): IteExpr = + if (this.cond === cond && this.then === then && this.elze === elze) { + this } else { - return IteExpr.of(cond, then, elze); + of(cond, then, elze) } - } - - public IteExpr withCond(final Expr cond) { - return with(cond, getThen(), getElse()); - } - - public IteExpr withThen(final Expr then) { - return with(getCond(), then, getElse()); - } - public IteExpr withElse(final Expr elze) { - return with(getCond(), getThen(), elze); - } + fun withCond(cond: Expr): IteExpr = with(cond, then, elze) - @Override - public int hashCode() { - int result = hashCode; - if (result == 0) { - result = HASH_SEED; - result = 31 * result + cond.hashCode(); - result = 31 * result + then.hashCode(); - result = 31 * result + elze.hashCode(); - hashCode = result; - } - return result; - } + fun withThen(then: Expr): IteExpr = with(cond, then, elze) - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final IteExpr that = (IteExpr) obj; - return this.getCond().equals(that.getCond()) - && this.getThen().equals(that.getThen()) - && this.getElse().equals(that.getElse()); - } else { - return false; - } - } + fun withElse(elze: Expr): IteExpr = with(cond, then, elze) - @Override - public String toString() { - return Utils.lispStringBuilder(OPERATOR_LABEL) - .body() - .add(getCond()) - .add(getThen()) - .add(getElse()) - .toString(); - } + override fun toString(): String = Utils.lispStringBuilder(OPERATOR_LABEL) + .add(cond) + .add(then) + .add(elze) + .toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/PrimeExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/PrimeExpr.kt index 1f88acb42a..929169e875 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/PrimeExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/PrimeExpr.kt @@ -13,66 +13,41 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.anytype; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.type.Type; -import hu.bme.mit.theta.core.type.UnaryExpr; - -public final class PrimeExpr extends UnaryExpr { - - private static final int HASH_SEED = 4561; - - private static final String OPERATOR_LABEL = "prime"; - - private PrimeExpr(final Expr op) { - super(op); - } +package hu.bme.mit.theta.core.type.anytype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.type.Type +import hu.bme.mit.theta.core.type.UnaryExpr +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +/** + * Represents a prime expression (next state). + * + * @param ExprType The type of the expression + */ +@Serializable +@SerialName(PrimeExpr.OPERATOR_LABEL) +data class PrimeExpr( + override val op: Expr +) : UnaryExpr() { - public static PrimeExpr of(final Expr op) { - return new PrimeExpr<>(op); - } + companion object { - @Override - public final ExprType getType() { - return getOp().getType(); - } + internal const val OPERATOR_LABEL = "prime" - @Override - public LitExpr eval(final Valuation val) { - throw new UnsupportedOperationException(); + fun of(op: Expr): PrimeExpr = PrimeExpr(op) } - @Override - public final UnaryExpr with(final Expr op) { - if (op == getOp()) { - return this; - } else { - return PrimeExpr.of(op); - } - } + override val type: ExprType = op.type - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final PrimeExpr that = (PrimeExpr) obj; - return this.getOp().equals(that.getOp()); - } else { - return false; - } + override fun eval(`val`: Valuation): LitExpr { + throw UnsupportedOperationException("Prime expressions cannot be evaluated") } - @Override - protected final int getHashSeed() { - return HASH_SEED; - } + override fun with(op: Expr): PrimeExpr = if (op == this.op) this else of(op) - @Override - public final String getOperatorLabel() { - return OPERATOR_LABEL; - } + override val operatorLabel: String = OPERATOR_LABEL } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/RefExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/RefExpr.kt index 2b08b82e0c..e8d1519aee 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/RefExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/RefExpr.kt @@ -13,70 +13,38 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.anytype; - -import static com.google.common.base.Preconditions.checkNotNull; - -import hu.bme.mit.theta.core.decl.Decl; -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.type.NullaryExpr; -import hu.bme.mit.theta.core.type.Type; - -public final class RefExpr extends NullaryExpr { - - private static final int HASH_SEED = 167; - private volatile int hashCode = 0; - - private final Decl decl; - - private RefExpr(final Decl decl) { - this.decl = checkNotNull(decl); - } - - public static RefExpr of(final Decl decl) { - return new RefExpr<>(decl); - } +package hu.bme.mit.theta.core.type.anytype + +import hu.bme.mit.theta.core.decl.Decl +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.type.NullaryExpr +import hu.bme.mit.theta.core.type.Type +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +/** + * Represents a reference to a declaration. + * + * @param DeclType The type of the declaration + */ +@Serializable +@SerialName("Ref") +data class RefExpr( + val decl: Decl +) : NullaryExpr() { - public Decl getDecl() { - return decl; - } + companion object { - @Override - public DeclType getType() { - return decl.getType(); + fun of(decl: Decl): RefExpr = RefExpr(decl) } - @Override - public LitExpr eval(final Valuation val) { - return val.eval(decl).get(); - } + override val type: DeclType = decl.type - @Override - public int hashCode() { - int result = hashCode; - if (result == 0) { - result = HASH_SEED; - result = 31 * result + decl.hashCode(); - hashCode = result; + override fun eval(`val`: Valuation): LitExpr = + `val`.eval(decl).orElseThrow { + IllegalStateException("No value found for declaration: ${decl.name}") } - return result; - } - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final RefExpr that = (RefExpr) obj; - return this.getDecl().equals(that.getDecl()); - } else { - return false; - } - } - - @Override - public String toString() { - return decl.getName(); - } + override fun toString(): String = decl.name } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/Reference.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/Reference.kt index b1bb3cb257..f6185453b9 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/Reference.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/Reference.kt @@ -13,84 +13,54 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.anytype; +package hu.bme.mit.theta.core.type.anytype -import static com.google.common.base.Preconditions.checkState; +import hu.bme.mit.theta.common.Utils +import hu.bme.mit.theta.core.decl.VarDecl +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.type.Type +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -import hu.bme.mit.theta.common.Utils; -import hu.bme.mit.theta.core.decl.VarDecl; -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.type.Type; -import java.util.List; -import java.util.Objects; - -public final class Reference implements Expr { - - private static final String OPERATOR_LABEL = "ref"; - private final Expr expr; - private final A type; - - private Reference(Expr expr, A type) { - this.expr = expr; - this.type = type; - } - - public Expr getExpr() { - return expr; - } - - public static Reference of(Expr expr, A type) { - return new Reference<>(expr, type); - } - - @Override - public int getArity() { - return 1; - } +/** + * Represents a reference to an expression. + * + * @param A The type of the reference + * @param T The type of the expression + * @property expr The referenced expression + * @property type The type of the reference + */ +@Serializable +@SerialName(Reference.OPERATOR_LABEL) +data class Reference( + val expr: Expr, + override val type: A +) : Expr { - @Override - public A getType() { - return type; - } + companion object { + internal const val OPERATOR_LABEL = "ref" - @Override - public LitExpr eval(Valuation val) { - throw new IllegalStateException( - "Reference/Dereference expressions are not meant to be evaluated!"); + fun of(expr: Expr, type: A): Reference = Reference(expr, type) } - @Override - public List> getOps() { - return List.of(expr); - } + override val arity: Int = 1 - @Override - public Expr withOps(List> ops) { - checkState(ops.size() == 1); - checkState( - ops.get(0) instanceof RefExpr - && ((RefExpr) ops.get(0)).getDecl() instanceof VarDecl, - "Don't transform references to constants."); - return Reference.of((Expr) ops.get(0), type); - } + override val ops: List> = listOf(expr) - @Override - public int hashCode() { - return Objects.hash(expr, type); - } + override fun eval(`val`: Valuation): LitExpr = + throw IllegalStateException("Reference/Dereference expressions are not meant to be evaluated!") - @Override - public boolean equals(Object obj) { - if (obj instanceof Reference that) { - return Objects.equals(this.expr, that.expr) && Objects.equals(this.type, that.type); + override fun withOps(ops: List>): Expr { + require(ops.size == 1) { "Reference must have exactly one operand" } + require(ops[0] is RefExpr<*> && (ops[0] as RefExpr<*>).decl is VarDecl<*>) { + "Don't transform references to constants." } - return false; + @Suppress("UNCHECKED_CAST") + return Reference(ops[0] as Expr, type) } - @Override - public String toString() { - return Utils.lispStringBuilder(OPERATOR_LABEL).body().add(getExpr()).add(type).toString(); - } + override fun toString(): String = + Utils.lispStringBuilder(OPERATOR_LABEL).body().add(expr).add(type).toString() } diff --git a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/SsaPass.kt b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/SsaPass.kt deleted file mode 100644 index 92aaa7eba7..0000000000 --- a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/SsaPass.kt +++ /dev/null @@ -1,147 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.xcfa.passes - -import hu.bme.mit.theta.core.decl.IndexedVarDecl -import hu.bme.mit.theta.core.decl.VarDecl -import hu.bme.mit.theta.core.stmt.AssignStmt -import hu.bme.mit.theta.core.stmt.AssumeStmt -import hu.bme.mit.theta.core.stmt.HavocStmt -import hu.bme.mit.theta.core.type.Expr -import hu.bme.mit.theta.core.type.Type -import hu.bme.mit.theta.core.type.anytype.RefExpr -import hu.bme.mit.theta.core.utils.ExprUtils -import hu.bme.mit.theta.core.utils.indexings.VarIndexing -import hu.bme.mit.theta.core.utils.indexings.VarIndexingFactory -import hu.bme.mit.theta.xcfa.model.* - -/** Transform the procedure to Static Single Assignment (SSA) form. */ -class SSAPass : ProcedurePass { - - private val ssaUtils = SSAUtils() - - override fun run(builder: XcfaProcedureBuilder): XcfaProcedureBuilder { - builder.getEdges().toSet().forEach { edge -> - builder.removeEdge(edge) - builder.addEdge(edge.withLabel(ssaUtils.toSSA(edge))) - } - return builder - } -} - -internal class SSAUtils { - - private var indexing: VarIndexing = VarIndexingFactory.indexing(0) - - private val indexedVars = mutableSetOf>() - - fun toSSA(edge: XcfaEdge) = edge.label.toSSA() - - fun removeSSA(edge: XcfaEdge) = edge.withLabel(edge.label.removeSSA()) - - // Convert to SSA - - private fun XcfaLabel.toSSA(): XcfaLabel { - return when (this) { - is StmtLabel -> { - when (val stmt = this.stmt) { - is AssignStmt<*> -> StmtLabel(stmt.toSSA(), choiceType, metadata) - is AssumeStmt -> StmtLabel(stmt.toSSA(), choiceType, metadata) - is HavocStmt<*> -> StmtLabel(stmt.toSSA(), choiceType, metadata) - else -> error("Unsupported statement at SSA conversion: $stmt") - } - } - - is StartLabel -> - StartLabel(name, params.map { it.toSSA() }, pidVar.getIndexed(), metadata, tempLookup) - is JoinLabel -> JoinLabel(pidVar.getIndexed(), metadata) - is SequenceLabel -> SequenceLabel(labels.map { it.toSSA() }, metadata) - is NopLabel, - is FenceLabel -> this - else -> error("Unsupported label at SSA conversion: $this") - } - } - - private fun Expr.toSSA(): Expr { - val unfolded = toSSAAtomic() - ExprUtils.getVars(this).forEach { indexing = indexing.inc(it) } - return unfolded - } - - private fun Expr.toSSAAtomic(): Expr = - if (this is RefExpr) { - (decl as? VarDecl)?.getIndexed(false)?.ref ?: this - } else { - map { it.toSSAAtomic() } - } - - private fun VarDecl.getIndexed(increment: Boolean = true): VarDecl { - val newName = this.name + "#" + indexing[this] - indexedVars - .find { it.name == newName } - ?.let { - return it as VarDecl - } - val newVar = IndexedVarDecl.of(newName, this) - indexedVars.add(newVar) - if (increment) indexing = indexing.inc(this) - return newVar - } - - private fun AssignStmt.toSSA() = AssignStmt.of(varDecl.getIndexed(), expr.toSSA()) - - private fun AssumeStmt.toSSA() = AssumeStmt.of(cond.toSSA()) - - private fun HavocStmt.toSSA() = HavocStmt.of(varDecl.getIndexed()) - - // Remove SSA - - private fun XcfaLabel.removeSSA(): XcfaLabel { - return when (this) { - is StmtLabel -> { - when (val stmt = this.stmt) { - is AssignStmt<*> -> StmtLabel(stmt.removeSSA(), choiceType, metadata) - is AssumeStmt -> StmtLabel(stmt.removeSSA(), choiceType, metadata) - is HavocStmt<*> -> StmtLabel(stmt.removeSSA(), choiceType, metadata) - else -> this - } - } - - is StartLabel -> - StartLabel(name, params.map { it.removeSSA() }, pidVar.noindex, metadata, tempLookup) - is JoinLabel -> JoinLabel(pidVar.noindex, metadata) - is SequenceLabel -> SequenceLabel(labels.map { it.removeSSA() }, metadata) - else -> this - } - } - - private fun Expr.removeSSA(): Expr = - if (this is RefExpr) { - ((decl as? IndexedVarDecl)?.original ?: decl).ref - } else { - map { it.removeSSA() } - } - - private val VarDecl.noindex - get() = (this as? IndexedVarDecl)?.original ?: this - - private fun AssignStmt.removeSSA() = - AssignStmt.of(varDecl.noindex, expr.removeSSA()) - - private fun AssumeStmt.removeSSA() = AssumeStmt.of(cond.removeSSA()) - - private fun HavocStmt.removeSSA() = HavocStmt.of(varDecl.noindex) -} From 2e24ee655b76ac71f055352e61594a3f07e8880e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Csan=C3=A1d=20Telbisz?= Date: Tue, 17 Jun 2025 16:22:16 +0200 Subject: [PATCH 03/48] Rename .java to .kt --- .../type/abstracttype/{AbstractExprs.java => AbstractExprs.kt} | 0 .../mit/theta/core/type/abstracttype/{DivExpr.java => DivExpr.kt} | 0 .../theta/core/type/abstracttype/{Divisible.java => Divisible.kt} | 0 .../mit/theta/core/type/abstracttype/{EqExpr.java => EqExpr.kt} | 0 .../core/type/abstracttype/{Equational.java => Equational.kt} | 0 .../mit/theta/core/type/abstracttype/{GeqExpr.java => GeqExpr.kt} | 0 .../mit/theta/core/type/abstracttype/{GtExpr.java => GtExpr.kt} | 0 .../mit/theta/core/type/abstracttype/{LeqExpr.java => LeqExpr.kt} | 0 .../mit/theta/core/type/abstracttype/{LtExpr.java => LtExpr.kt} | 0 .../mit/theta/core/type/abstracttype/{ModExpr.java => ModExpr.kt} | 0 .../mit/theta/core/type/abstracttype/{MulExpr.java => MulExpr.kt} | 0 .../type/abstracttype/{Multiplicative.java => Multiplicative.kt} | 0 .../mit/theta/core/type/abstracttype/{NegExpr.java => NegExpr.kt} | 0 .../mit/theta/core/type/abstracttype/{NeqExpr.java => NeqExpr.kt} | 0 .../mit/theta/core/type/abstracttype/{Ordered.java => Ordered.kt} | 0 .../mit/theta/core/type/abstracttype/{PosExpr.java => PosExpr.kt} | 0 .../mit/theta/core/type/abstracttype/{RemExpr.java => RemExpr.kt} | 0 .../mit/theta/core/type/abstracttype/{SubExpr.java => SubExpr.kt} | 0 18 files changed, 0 insertions(+), 0 deletions(-) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/{AbstractExprs.java => AbstractExprs.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/{DivExpr.java => DivExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/{Divisible.java => Divisible.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/{EqExpr.java => EqExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/{Equational.java => Equational.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/{GeqExpr.java => GeqExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/{GtExpr.java => GtExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/{LeqExpr.java => LeqExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/{LtExpr.java => LtExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/{ModExpr.java => ModExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/{MulExpr.java => MulExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/{Multiplicative.java => Multiplicative.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/{NegExpr.java => NegExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/{NeqExpr.java => NeqExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/{Ordered.java => Ordered.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/{PosExpr.java => PosExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/{RemExpr.java => RemExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/{SubExpr.java => SubExpr.kt} (100%) diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/AbstractExprs.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/AbstractExprs.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/AbstractExprs.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/AbstractExprs.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/DivExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/DivExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/DivExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/DivExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Divisible.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Divisible.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Divisible.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Divisible.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/EqExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/EqExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/EqExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/EqExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Equational.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Equational.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Equational.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Equational.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/GeqExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/GeqExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/GeqExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/GeqExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/GtExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/GtExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/GtExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/GtExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/LeqExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/LeqExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/LeqExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/LeqExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/LtExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/LtExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/LtExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/LtExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/ModExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/ModExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/ModExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/ModExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/MulExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/MulExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/MulExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/MulExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Multiplicative.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Multiplicative.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Multiplicative.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Multiplicative.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/NegExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/NegExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/NegExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/NegExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/NeqExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/NeqExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/NeqExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/NeqExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Ordered.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Ordered.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Ordered.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Ordered.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/PosExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/PosExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/PosExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/PosExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/RemExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/RemExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/RemExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/RemExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/SubExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/SubExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/SubExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/SubExpr.kt From 1b1e472079f9930012304e89ec20adc48ebb4e6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Csan=C3=A1d=20Telbisz?= Date: Tue, 17 Jun 2025 16:22:22 +0200 Subject: [PATCH 04/48] convert to serializable - abstracttype --- subprojects/common/core/build.gradle.kts | 1 + .../core/type/abstracttype/AbstractExprs.kt | 452 +++++++----------- .../theta/core/type/abstracttype/AddExpr.kt | 1 + .../theta/core/type/abstracttype/Additive.kt | 4 +- .../theta/core/type/abstracttype/DivExpr.kt | 57 +-- .../theta/core/type/abstracttype/Divisible.kt | 36 +- .../theta/core/type/abstracttype/EqExpr.kt | 54 +-- .../core/type/abstracttype/Equational.kt | 35 +- .../theta/core/type/abstracttype/GeqExpr.kt | 55 +-- .../theta/core/type/abstracttype/GtExpr.kt | 58 +-- .../theta/core/type/abstracttype/LeqExpr.kt | 57 +-- .../theta/core/type/abstracttype/LtExpr.kt | 57 +-- .../theta/core/type/abstracttype/ModExpr.kt | 56 +-- .../theta/core/type/abstracttype/MulExpr.kt | 56 +-- .../core/type/abstracttype/Multiplicative.kt | 35 +- .../theta/core/type/abstracttype/NegExpr.kt | 52 +- .../theta/core/type/abstracttype/NeqExpr.kt | 57 +-- .../theta/core/type/abstracttype/Ordered.kt | 41 +- .../theta/core/type/abstracttype/PosExpr.kt | 52 +- .../theta/core/type/abstracttype/RemExpr.kt | 56 +-- .../theta/core/type/abstracttype/SubExpr.kt | 56 +-- 21 files changed, 526 insertions(+), 802 deletions(-) diff --git a/subprojects/common/core/build.gradle.kts b/subprojects/common/core/build.gradle.kts index c11d9c4492..e00eafe5d3 100644 --- a/subprojects/common/core/build.gradle.kts +++ b/subprojects/common/core/build.gradle.kts @@ -19,6 +19,7 @@ plugins { id("java-test-fixtures") id("kotlin-common") id("kaml-serialization") + id("kotlinx-serialization") } dependencies { diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/AbstractExprs.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/AbstractExprs.kt index e3aa3d2338..e7fd46438b 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/AbstractExprs.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/AbstractExprs.kt @@ -1,323 +1,213 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. +package hu.bme.mit.theta.core.type.abstracttype + +import hu.bme.mit.theta.common.Try +import hu.bme.mit.theta.common.Utils +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.Type +import hu.bme.mit.theta.core.type.anytype.Exprs +import hu.bme.mit.theta.core.type.anytype.IteExpr +import hu.bme.mit.theta.core.type.booltype.BoolType + +/** + * Factory and utility methods for abstract expressions over multiple types. */ -package hu.bme.mit.theta.core.type.abstracttype; +object AbstractExprs { -import static com.google.common.base.Preconditions.checkArgument; - -import com.google.common.collect.ImmutableList; -import hu.bme.mit.theta.common.Try; -import hu.bme.mit.theta.common.Tuple2; -import hu.bme.mit.theta.common.Utils; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.Type; -import hu.bme.mit.theta.core.type.anytype.Exprs; -import hu.bme.mit.theta.core.type.anytype.IteExpr; -import hu.bme.mit.theta.core.type.booltype.BoolType; -import java.util.List; - -public final class AbstractExprs { - - private AbstractExprs() {} - - /* - * General - */ - - public static IteExpr Ite( - final Expr cond, final Expr then, final Expr elze) { - final Tuple2, Expr> newOps = unify(then, elze); - final Expr newThen = newOps.get1(); - final Expr newElse = newOps.get2(); - return Exprs.Ite(cond, newThen, newElse); + // General + fun Ite(cond: Expr, then: Expr<*>, elze: Expr<*>): IteExpr<*> { + val newOps: Pair, Expr> = unify(then, elze) + val newThen = newOps.first + val newElse = newOps.second + return Exprs.Ite(cond, newThen, newElse) } - /* - * Additive - */ - - public static > AddExpr Add(final Iterable> ops) { - final List> opList = ImmutableList.copyOf(ops); - checkArgument(!opList.isEmpty()); - final Expr head = Utils.head(opList); - final List> tail = Utils.tail(opList); - return combineAdd(head, tail); + // Additive + fun > Add(ops: Iterable>): AddExpr { + val opList = ops.toList() + require(opList.isNotEmpty()) + val head = Utils.head(opList) + val tail = Utils.tail(opList) + return combineAdd(head, tail) } - private static > AddExpr combineAdd( - final Expr head, final List> tail) { + private fun > combineAdd(head: Expr<*>, tail: List>): AddExpr = if (tail.isEmpty()) { - final Expr newOp = bind(head); - final List> newOps = getAddOps(newOp); - final T type = newOp.getType(); - return type.Add(newOps); - + val newOp: Expr = bind(head) + val newOps = getAddOps(newOp) + val type = newOp.type + type.Add(newOps) } else { - final Expr newHead = Utils.head(tail); - final List> newTail = Utils.tail(tail); - - final Tuple2, Expr> unifiedOps = unify(head, newHead); - final Expr newLeftOp = unifiedOps.get1(); - final Expr newRightOp = unifiedOps.get2(); - final T type = newLeftOp.getType(); - - final List> newLeftOps = getAddOps(newLeftOp); - final List> newOps = - ImmutableList.>builder().addAll(newLeftOps).add(newRightOp).build(); - final AddExpr newAddExpr = type.Add(newOps); - return combineAdd(newAddExpr, newTail); + val newHead = Utils.head(tail) + val newTail = Utils.tail(tail) + val unifiedOps: Pair, Expr> = unify(head, newHead) + val newLeftOp = unifiedOps.first + val newRightOp = unifiedOps.second + val type = newLeftOp.type + val newLeftOps = getAddOps(newLeftOp) + val newOps = newLeftOps + newRightOp + val newAddExpr = type.Add(newOps) + combineAdd(newAddExpr, newTail) } - } - private static > List> getAddOps(final Expr expr) { - if (expr instanceof AddExpr) { - final AddExpr addExpr = (AddExpr) expr; - return addExpr.getOps(); - } else { - return ImmutableList.of(expr); - } - } + private fun > getAddOps(expr: Expr): List> = + if (expr is AddExpr<*>) (expr as AddExpr).ops else listOf(expr) - public static > SubExpr Sub( - final Expr leftOp, final Expr rightOp) { - final Tuple2, Expr> newOps = unify(leftOp, rightOp); - final Expr newLeftOp = newOps.get1(); - final Expr newRightOp = newOps.get2(); - final T type = newLeftOp.getType(); - return type.Sub(newLeftOp, newRightOp); - } + fun > Sub(leftOp: Expr<*>, rightOp: Expr<*>): SubExpr<*> = + create(leftOp, rightOp) { type: T, l, r -> + type.Sub(l, r) + } - public static > PosExpr Pos(final Expr op) { - final Expr tOp = bind(op); - final T type = tOp.getType(); - return type.Pos(tOp); + fun > Pos(op: Expr<*>): PosExpr<*> { + val tOp: Expr = bind(op) + val type = tOp.type + return type.Pos(tOp) } - public static > NegExpr Neg(final Expr op) { - final Expr tOp = bind(op); - final T type = tOp.getType(); - return type.Neg(tOp); + fun > Neg(op: Expr<*>): NegExpr<*> { + val tOp: Expr = bind(op) + val type = tOp.type + return type.Neg(tOp) } - /* - * Multiplicative - */ - - public static > MulExpr Mul( - final Iterable> ops) { - final List> opList = ImmutableList.copyOf(ops); - checkArgument(!opList.isEmpty()); - final Expr head = Utils.head(opList); - final List> tail = Utils.tail(opList); - return combineMul(head, tail); + // Multiplicative + fun > Mul(ops: Iterable>): MulExpr<*> { + val opList = ops.toList() + require(opList.isNotEmpty()) + val head = Utils.head(opList) + val tail = Utils.tail(opList) + return combineMul(head, tail) } - private static > MulExpr combineMul( - final Expr head, final List> tail) { + private fun > combineMul(head: Expr<*>, tail: List>): MulExpr = if (tail.isEmpty()) { - final Expr newOp = bind(head); - final List> newOps = getMulOps(newOp); - final T type = newOp.getType(); - return type.Mul(newOps); - + val newOp: Expr = bind(head) + val newOps = getMulOps(newOp) + val type = newOp.type + type.Mul(newOps) } else { - final Expr newHead = Utils.head(tail); - final List> newTail = Utils.tail(tail); + val newHead = Utils.head(tail) + val newTail = Utils.tail(tail) + val unifiedOps: Pair, Expr> = unify(head, newHead) + val newLeftOp = unifiedOps.first + val newRightOp = unifiedOps.second + val type = newLeftOp.type + val newLeftOps = getMulOps(newLeftOp) + val newOps = newLeftOps + newRightOp + val newMulExpr = type.Mul(newOps) + combineMul(newMulExpr, newTail) + } - final Tuple2, Expr> unifiedOps = unify(head, newHead); - final Expr newLeftOp = unifiedOps.get1(); - final Expr newRightOp = unifiedOps.get2(); - final T type = newLeftOp.getType(); + private fun > getMulOps(expr: Expr): List> = + if (expr is MulExpr<*>) (expr as MulExpr).ops else listOf(expr) - final List> newLeftOps = getMulOps(newLeftOp); - final List> newOps = - ImmutableList.>builder().addAll(newLeftOps).add(newRightOp).build(); - final MulExpr newMulExpr = type.Mul(newOps); - return combineMul(newMulExpr, newTail); + fun > Div(leftOp: Expr<*>, rightOp: Expr<*>): DivExpr<*> = + create(leftOp, rightOp) { type: T, l, r -> + type.Div(l, r) } - } - private static > List> getMulOps(final Expr expr) { - if (expr instanceof MulExpr) { - final MulExpr mulExpr = (MulExpr) expr; - return mulExpr.getOps(); - } else { - return ImmutableList.of(expr); + // Divisible + fun > Mod(leftOp: Expr<*>, rightOp: Expr<*>): ModExpr<*> = + create(leftOp, rightOp) { type: T, l, r -> + type.Mod(l, r) } - } - - public static > DivExpr Div( - final Expr leftOp, final Expr rightOp) { - final Tuple2, Expr> newOps = unify(leftOp, rightOp); - final Expr newLeftOp = newOps.get1(); - final Expr newRightOp = newOps.get2(); - final T type = newLeftOp.getType(); - return type.Div(newLeftOp, newRightOp); - } - - /* - * Divisible - */ - - public static > ModExpr Mod( - final Expr leftOp, final Expr rightOp) { - final Tuple2, Expr> newOps = unify(leftOp, rightOp); - final Expr newLeftOp = newOps.get1(); - final Expr newRightOp = newOps.get2(); - final T type = newLeftOp.getType(); - return type.Mod(newLeftOp, newRightOp); - } - - public static > RemExpr Rem( - final Expr leftOp, final Expr rightOp) { - final Tuple2, Expr> newOps = unify(leftOp, rightOp); - final Expr newLeftOp = newOps.get1(); - final Expr newRightOp = newOps.get2(); - final T type = newLeftOp.getType(); - return type.Rem(newLeftOp, newRightOp); - } - /* - * Equational - */ - - public static > EqExpr Eq( - final Expr leftOp, final Expr rightOp) { - final Tuple2, Expr> newOps = unify(leftOp, rightOp); - final Expr newLeftOp = newOps.get1(); - final Expr newRightOp = newOps.get2(); - final T type = newLeftOp.getType(); - return type.Eq(newLeftOp, newRightOp); - } - - public static > NeqExpr Neq( - final Expr leftOp, final Expr rightOp) { - final Tuple2, Expr> newOps = unify(leftOp, rightOp); - final Expr newLeftOp = newOps.get1(); - final Expr newRightOp = newOps.get2(); - final T type = newLeftOp.getType(); - return type.Neq(newLeftOp, newRightOp); - } - - /* - * Ordered - */ - - public static > LtExpr Lt(final Expr leftOp, final Expr rightOp) { - final Tuple2, Expr> newOps = unify(leftOp, rightOp); - final Expr newLeftOp = newOps.get1(); - final Expr newRightOp = newOps.get2(); - final T type = newLeftOp.getType(); - return type.Lt(newLeftOp, newRightOp); - } - - public static > LeqExpr Leq( - final Expr leftOp, final Expr rightOp) { - final Tuple2, Expr> newOps = unify(leftOp, rightOp); - final Expr newLeftOp = newOps.get1(); - final Expr newRightOp = newOps.get2(); - final T type = newLeftOp.getType(); - return type.Leq(newLeftOp, newRightOp); - } - - public static > GtExpr Gt(final Expr leftOp, final Expr rightOp) { - final Tuple2, Expr> newOps = unify(leftOp, rightOp); - final Expr newLeftOp = newOps.get1(); - final Expr newRightOp = newOps.get2(); - final T type = newLeftOp.getType(); - return type.Gt(newLeftOp, newRightOp); - } - - public static > GeqExpr Geq( - final Expr leftOp, final Expr rightOp) { - final Tuple2, Expr> newOps = unify(leftOp, rightOp); - final Expr newLeftOp = newOps.get1(); - final Expr newRightOp = newOps.get2(); - final T type = newLeftOp.getType(); - return type.Geq(newLeftOp, newRightOp); - } + fun > Rem(leftOp: Expr<*>, rightOp: Expr<*>): RemExpr<*> = + create(leftOp, rightOp) { type: T, l, r -> + type.Rem(l, r) + } - /* - * Convenience methods - */ + // Equational + fun > Eq(leftOp: Expr<*>, rightOp: Expr<*>): EqExpr<*> = + create(leftOp, rightOp) { type: T, l, r -> + type.Eq(l, r) + } - public static > AddExpr Add( - final Expr leftOp, final Expr rightOp) { - return Add(ImmutableList.of(leftOp, rightOp)); - } + fun > Neq(leftOp: Expr<*>, rightOp: Expr<*>): NeqExpr<*> = + create(leftOp, rightOp) { type: T, l, r -> + type.Neq(l, r) + } - public static > MulExpr Mul( - final Expr leftOp, final Expr rightOp) { - return Mul(ImmutableList.of(leftOp, rightOp)); - } + // Ordered + fun > Lt(leftOp: Expr<*>, rightOp: Expr<*>): LtExpr<*> = + create(leftOp, rightOp) { type: T, l, r -> + type.Lt(l, r) + } - /* - * Helper methods - */ + fun > Leq(leftOp: Expr<*>, rightOp: Expr<*>): LeqExpr<*> = + create(leftOp, rightOp) { type: T, l, r -> + type.Leq(l, r) + } - private static > - Tuple2, Expr> unify(final Expr expr1, final Expr expr2) { - final T1 type1 = expr1.getType(); - final T2 type2 = expr2.getType(); + fun > Gt(leftOp: Expr<*>, rightOp: Expr<*>): GtExpr<*> = + create(leftOp, rightOp) { type: T, l, r -> + type.Gt(l, r) + } - if (expr1.getType().equals(expr2.getType())) { - @SuppressWarnings("unchecked") - final Expr t1Expr2 = (Expr) expr2; - return bind(expr1, t1Expr2); + fun > Geq(leftOp: Expr<*>, rightOp: Expr<*>): GeqExpr<*> = + create(leftOp, rightOp) { type: T, l, r -> + type.Geq(l, r) } - if (type1 instanceof Castable) { - @SuppressWarnings("unchecked") - final C cType1 = (C) type1; - @SuppressWarnings("unchecked") - final Expr cExpr1 = (Expr) expr1; - final Try> tryToCast = Try.attempt(() -> cType1.Cast(cExpr1, type2)); - if (tryToCast.isSuccess()) { - final Expr t2Expr1 = tryToCast.asSuccess().getValue(); - return bind(t2Expr1, expr2); + // Convenience methods + fun > Add(leftOp: Expr<*>, rightOp: Expr<*>): AddExpr<*> = + Add(listOf(leftOp, rightOp)) + + fun > Mul(leftOp: Expr<*>, rightOp: Expr<*>): MulExpr<*> = + Mul(listOf(leftOp, rightOp)) + + // Helper methods + + private fun > create( + leftOp: Expr<*>, rightOp: Expr<*>, create: (T, Expr, Expr) -> R + ): R { + val newOps: Pair, Expr> = unify(leftOp, rightOp) + val newLeftOp = newOps.first + val newRightOp = newOps.second + val type = newLeftOp.type + return create(type, newLeftOp, newRightOp) + } + + private fun > unify( + expr1: Expr, expr2: Expr + ): Pair, Expr> { + val type1 = expr1.type + val type2 = expr2.type + if (type1 == type2) { + @Suppress("UNCHECKED_CAST") + return bind(expr1, expr2 as Expr) + } + if (type1 is Castable<*>) { + @Suppress("UNCHECKED_CAST") + val cType1 = type1 as C + + @Suppress("UNCHECKED_CAST") + val cExpr1 = expr1 as Expr + val tryToCast = Try.attempt { cType1.Cast(cExpr1, type2) } + if (tryToCast.isSuccess) { + val t2Expr1 = tryToCast.asSuccess().value + return bind(t2Expr1, expr2) } } - - if (type2 instanceof Castable) { - @SuppressWarnings("unchecked") - final C cType2 = (C) type2; - @SuppressWarnings("unchecked") - final Expr cExpr2 = (Expr) expr2; - final Try> tryToCast = Try.attempt(() -> cType2.Cast(cExpr2, type1)); - if (tryToCast.isSuccess()) { - final Expr t1Expr2 = tryToCast.asSuccess().getValue(); - return bind(expr1, t1Expr2); + if (type2 is Castable<*>) { + @Suppress("UNCHECKED_CAST") + val cType2 = type2 as C + + @Suppress("UNCHECKED_CAST") + val cExpr2 = expr2 as Expr + val tryToCast = Try.attempt { cType2.Cast(cExpr2, type1) } + if (tryToCast.isSuccess) { + val t1Expr2 = tryToCast.asSuccess().value + return bind(expr1, t1Expr2) } } - - throw new ClassCastException( - "Types " + expr1.getType() + " and " + expr2.getType() + " can not be unified"); + throw ClassCastException("Types $type1 and $type2 can not be unified") } - private static Expr bind(final Expr expr) { - @SuppressWarnings("unchecked") - final Expr trExpr = (Expr) expr; - return trExpr; - } + @Suppress("UNCHECKED_CAST") + private fun bind(expr: Expr): Expr = expr as Expr - private static Tuple2, Expr> bind( - final Expr expr1, final Expr expr2) { - @SuppressWarnings("unchecked") - final Expr trExpr1 = (Expr) expr1; - @SuppressWarnings("unchecked") - final Expr trExpr2 = (Expr) expr2; - return Tuple2.of(trExpr1, trExpr2); - } + @Suppress("UNCHECKED_CAST") + private fun bind(expr1: Expr, expr2: Expr): Pair, Expr> = + Pair(expr1 as Expr, expr2 as Expr) } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/AddExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/AddExpr.kt index 4995dc0be8..de9b08cdec 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/AddExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/AddExpr.kt @@ -28,6 +28,7 @@ abstract class AddExpr> : MultiaryExpr> create2(ops: List>): AddExpr<*> { require(ops.isNotEmpty()) @Suppress("UNCHECKED_CAST") diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Additive.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Additive.kt index 22d578818d..6fd8ec3274 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Additive.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Additive.kt @@ -18,8 +18,10 @@ package hu.bme.mit.theta.core.type.abstracttype import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.Type +import kotlinx.serialization.Polymorphic -abstract class Additive> : Type() { +@Polymorphic +abstract class Additive> : Type { abstract fun Add(ops: Iterable>): AddExpr diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/DivExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/DivExpr.kt index 348ee7d2dd..4c548351d4 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/DivExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/DivExpr.kt @@ -1,38 +1,31 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.abstracttype; - -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; +package hu.bme.mit.theta.core.type.abstracttype -import hu.bme.mit.theta.core.type.BinaryExpr; -import hu.bme.mit.theta.core.type.Expr; +import hu.bme.mit.theta.core.type.BinaryExpr +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.Serializable -public abstract class DivExpr> - extends BinaryExpr { +/** + * Abstract base class for division expressions over types that support multiplication and division. + * Used to represent division operations in the expression tree. + */ +@Serializable +abstract class DivExpr> : BinaryExpr() { - protected DivExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - } + companion object { - public static > DivExpr create2( - final Expr leftOp, final Expr rightOp) { - @SuppressWarnings("unchecked") - final ExprType type = (ExprType) leftOp.getType(); - final Expr newLeftOp = cast(leftOp, type); - final Expr newRightOp = cast(rightOp, type); - return type.Div(newLeftOp, newRightOp); + @JvmStatic + fun > create2( + leftOp: Expr<*>, + rightOp: Expr<*> + ): DivExpr<*> { + @Suppress("UNCHECKED_CAST") + val type = leftOp.type as ExprType + val newLeftOp = cast(leftOp, type) + val newRightOp = cast(rightOp, type) + return type.Div(newLeftOp, newRightOp) + } } } + + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Divisible.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Divisible.kt index 7eeaf458cc..913fc1fecf 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Divisible.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Divisible.kt @@ -1,26 +1,18 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.abstracttype; +package hu.bme.mit.theta.core.type.abstracttype -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.Type; +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.Type +import kotlinx.serialization.Polymorphic -public interface Divisible> extends Type { - - ModExpr Mod(Expr leftOp, Expr rightOp); +/** + * Represents a type that supports division-related operations. + * + * @param ExprType The type of expressions this type operates on. + */ +@Polymorphic +interface Divisible> : Type { - RemExpr Rem(Expr leftOp, Expr rightOp); + fun Mod(leftOp: Expr, rightOp: Expr): ModExpr + fun Rem(leftOp: Expr, rightOp: Expr): RemExpr } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/EqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/EqExpr.kt index d2629acd9d..bf0adcceaa 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/EqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/EqExpr.kt @@ -1,39 +1,27 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.abstracttype; +package hu.bme.mit.theta.core.type.abstracttype -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; +import hu.bme.mit.theta.core.type.BinaryExpr +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.booltype.BoolType +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.Serializable -import hu.bme.mit.theta.core.type.BinaryExpr; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.booltype.BoolType; +@Serializable +abstract class EqExpr> : BinaryExpr() { -public abstract class EqExpr> - extends BinaryExpr { + companion object { - protected EqExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - } - - public static > EqExpr create2( - final Expr leftOp, final Expr rightOp) { - @SuppressWarnings("unchecked") - final OpType type = (OpType) leftOp.getType(); - final Expr newLeftOp = cast(leftOp, type); - final Expr newRightOp = cast(rightOp, type); - return type.Eq(newLeftOp, newRightOp); + @JvmStatic + fun > create2( + leftOp: Expr<*>, + rightOp: Expr<*> + ): EqExpr<*> { + @Suppress("UNCHECKED_CAST") + val type = leftOp.type as OpType + val newLeftOp = cast(leftOp, type) + val newRightOp = cast(rightOp, type) + return type.Eq(newLeftOp, newRightOp) + } } } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Equational.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Equational.kt index 0fa1b66b59..f573638742 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Equational.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Equational.kt @@ -1,26 +1,17 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.abstracttype; +package hu.bme.mit.theta.core.type.abstracttype -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.Type; +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.Type +import kotlinx.serialization.Polymorphic -public interface Equational> extends Type { - - EqExpr Eq(Expr leftOp, Expr rightOp); +/** + * Represents a type that supports equational operations. + * + * @param OpType The type of the operands, which must also be equational. + */ +@Polymorphic +interface Equational> : Type { - NeqExpr Neq(Expr leftOp, Expr rightOp); + fun Eq(leftOp: Expr, rightOp: Expr): EqExpr + fun Neq(leftOp: Expr, rightOp: Expr): NeqExpr } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/GeqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/GeqExpr.kt index b9f16e3edd..f573240c6a 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/GeqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/GeqExpr.kt @@ -1,38 +1,29 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.abstracttype; - -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; +package hu.bme.mit.theta.core.type.abstracttype -import hu.bme.mit.theta.core.type.BinaryExpr; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.booltype.BoolType; +import hu.bme.mit.theta.core.type.BinaryExpr +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.booltype.BoolType +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.Serializable -public abstract class GeqExpr> extends BinaryExpr { +/** + * Abstract base class for greater-or-equal expressions over ordered types. + */ +@Serializable +abstract class GeqExpr> : BinaryExpr() { - protected GeqExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - } + companion object { - public static > GeqExpr create2( - final Expr leftOp, final Expr rightOp) { - @SuppressWarnings("unchecked") - final OpType type = (OpType) leftOp.getType(); - final Expr newLeftOp = cast(leftOp, type); - final Expr newRightOp = cast(rightOp, type); - return type.Geq(newLeftOp, newRightOp); + @JvmStatic + fun > create2( + leftOp: Expr<*>, + rightOp: Expr<*> + ): GeqExpr<*> { + @Suppress("UNCHECKED_CAST") + val type = leftOp.type as OpType + val newLeftOp = cast(leftOp, type) + val newRightOp = cast(rightOp, type) + return type.Geq(newLeftOp, newRightOp) + } } } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/GtExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/GtExpr.kt index 856205d2a6..61bc9f56b2 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/GtExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/GtExpr.kt @@ -1,38 +1,30 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.abstracttype; - -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import hu.bme.mit.theta.core.type.BinaryExpr; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.booltype.BoolType; +package hu.bme.mit.theta.core.type.abstracttype -public abstract class GtExpr> extends BinaryExpr { +import hu.bme.mit.theta.core.type.BinaryExpr +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.booltype.BoolType +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.Serializable - protected GtExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - } +/** + * Abstract base class for greater-than (>) expressions over ordered types. + * Used to represent > operations in the expression tree. + */ +@Serializable +abstract class GtExpr> : BinaryExpr() { - public static > GtExpr create2( - final Expr leftOp, final Expr rightOp) { - @SuppressWarnings("unchecked") - final OpType type = (OpType) leftOp.getType(); - final Expr newLeftOp = cast(leftOp, type); - final Expr newRightOp = cast(rightOp, type); - return type.Gt(newLeftOp, newRightOp); + companion object { + @JvmStatic + fun > create2( + leftOp: Expr<*>, + rightOp: Expr<*> + ): GtExpr<*> { + @Suppress("UNCHECKED_CAST") + val type = leftOp.type as OpType + val newLeftOp = cast(leftOp, type) + val newRightOp = cast(rightOp, type) + return type.Gt(newLeftOp, newRightOp) + } } } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/LeqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/LeqExpr.kt index f59627f12a..d15c44eeca 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/LeqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/LeqExpr.kt @@ -1,38 +1,29 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.abstracttype; - -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import hu.bme.mit.theta.core.type.BinaryExpr; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.booltype.BoolType; +package hu.bme.mit.theta.core.type.abstracttype -public abstract class LeqExpr> extends BinaryExpr { +import hu.bme.mit.theta.core.type.BinaryExpr +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.booltype.BoolType +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.Serializable - protected LeqExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - } +/** + * Abstract base class for less-or-equal (≤) expressions over ordered types. + */ +@Serializable +abstract class LeqExpr> : BinaryExpr() { - public static > LeqExpr create2( - final Expr leftOp, final Expr rightOp) { - @SuppressWarnings("unchecked") - final OpType type = (OpType) leftOp.getType(); - final Expr newLeftOp = cast(leftOp, type); - final Expr newRightOp = cast(rightOp, type); - return type.Leq(newLeftOp, newRightOp); + companion object { + @JvmStatic + fun > create2( + leftOp: Expr<*>, + rightOp: Expr<*> + ): LeqExpr<*> { + @Suppress("UNCHECKED_CAST") + val type = leftOp.type as OpType + val newLeftOp = cast(leftOp, type) + val newRightOp = cast(rightOp, type) + return type.Leq(newLeftOp, newRightOp) + } } } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/LtExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/LtExpr.kt index 338f192286..9540ad0de8 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/LtExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/LtExpr.kt @@ -1,38 +1,29 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.abstracttype; - -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import hu.bme.mit.theta.core.type.BinaryExpr; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.booltype.BoolType; +package hu.bme.mit.theta.core.type.abstracttype -public abstract class LtExpr> extends BinaryExpr { +import hu.bme.mit.theta.core.type.BinaryExpr +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.booltype.BoolType +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.Serializable - protected LtExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - } +/** + * Abstract base class for less-than (<) expressions over ordered types. + */ +@Serializable +abstract class LtExpr> : BinaryExpr() { - public static > LtExpr create2( - final Expr leftOp, final Expr rightOp) { - @SuppressWarnings("unchecked") - final OpType type = (OpType) leftOp.getType(); - final Expr newLeftOp = cast(leftOp, type); - final Expr newRightOp = cast(rightOp, type); - return type.Lt(newLeftOp, newRightOp); + companion object { + @JvmStatic + fun > create2( + leftOp: Expr<*>, + rightOp: Expr<*> + ): LtExpr<*> { + @Suppress("UNCHECKED_CAST") + val type = leftOp.type as OpType + val newLeftOp = cast(leftOp, type) + val newRightOp = cast(rightOp, type) + return type.Lt(newLeftOp, newRightOp) + } } } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/ModExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/ModExpr.kt index 7906c9af04..0e3ceec6f1 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/ModExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/ModExpr.kt @@ -1,38 +1,28 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.abstracttype; - -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import hu.bme.mit.theta.core.type.BinaryExpr; -import hu.bme.mit.theta.core.type.Expr; +package hu.bme.mit.theta.core.type.abstracttype -public abstract class ModExpr> - extends BinaryExpr { +import hu.bme.mit.theta.core.type.BinaryExpr +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.Serializable - protected ModExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - } +/** + * Abstract base class for modulo (mod) expressions over divisible types. + */ +@Serializable +abstract class ModExpr> : BinaryExpr() { - public static > ModExpr create2( - final Expr leftOp, final Expr rightOp) { - @SuppressWarnings("unchecked") - final ExprType type = (ExprType) leftOp.getType(); - final Expr newLeftOp = cast(leftOp, type); - final Expr newRightOp = cast(rightOp, type); - return type.Mod(newLeftOp, newRightOp); + companion object { + @JvmStatic + fun > create2( + leftOp: Expr<*>, + rightOp: Expr<*> + ): ModExpr<*> { + @Suppress("UNCHECKED_CAST") + val type = leftOp.type as ExprType + val newLeftOp = cast(leftOp, type) + val newRightOp = cast(rightOp, type) + return type.Mod(newLeftOp, newRightOp) + } } } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/MulExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/MulExpr.kt index 5197c1f81a..cb21ce2dcf 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/MulExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/MulExpr.kt @@ -1,40 +1,26 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.abstracttype; - -import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.collect.ImmutableList.toImmutableList; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.MultiaryExpr; -import java.util.List; +package hu.bme.mit.theta.core.type.abstracttype -public abstract class MulExpr> - extends MultiaryExpr { +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.MultiaryExpr +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.Serializable - protected MulExpr(final Iterable> ops) { - super(ops); - } +/** + * Abstract base class for multiplication expressions over types that support multiplication. + */ +@Serializable +abstract class MulExpr> : MultiaryExpr() { - public static > MulExpr create2( - final List> ops) { - checkArgument(!ops.isEmpty()); - @SuppressWarnings("unchecked") - final T type = (T) ops.get(0).getType(); - return type.Mul(ops.stream().map(op -> cast(op, type)).collect(toImmutableList())); + companion object { + @JvmStatic + fun > create2( + ops: List> + ): MulExpr<*> { + require(ops.isNotEmpty()) + @Suppress("UNCHECKED_CAST") + val type = ops[0].type as ExprType + return type.Mul(ops.map { cast(it, type) }) + } } } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Multiplicative.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Multiplicative.kt index 0f708ead4a..21ebb5d9b0 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Multiplicative.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Multiplicative.kt @@ -1,26 +1,15 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.abstracttype; - -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.Type; - -public interface Multiplicative> extends Type { +package hu.bme.mit.theta.core.type.abstracttype - MulExpr Mul(Iterable> ops); +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.Type +import kotlinx.serialization.Polymorphic - DivExpr Div(Expr leftOp, Expr rightOp); +/** + * Represents a type that supports multiplication and division operations. + */ +@Polymorphic +interface Multiplicative> : Type { + fun Mul(ops: Iterable>): MulExpr + fun Div(leftOp: Expr, rightOp: Expr): DivExpr } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/NegExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/NegExpr.kt index 0750164827..ed828cbf52 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/NegExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/NegExpr.kt @@ -1,36 +1,26 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.abstracttype; - -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.UnaryExpr; +package hu.bme.mit.theta.core.type.abstracttype -public abstract class NegExpr> - extends UnaryExpr { +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.UnaryExpr +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.Serializable - protected NegExpr(final Expr op) { - super(op); - } +/** + * Abstract base class for negation expressions over additive types. + */ +@Serializable +abstract class NegExpr> : UnaryExpr() { - public static > NegExpr create2(final Expr op) { - @SuppressWarnings("unchecked") - final ExprType type = (ExprType) op.getType(); - final Expr newOp = cast(op, type); - return type.Neg(newOp); + companion object { + @JvmStatic + fun > create2( + op: Expr<*> + ): NegExpr<*> { + @Suppress("UNCHECKED_CAST") + val type = op.type as ExprType + val newOp = cast(op, type) + return type.Neg(newOp) + } } } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/NeqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/NeqExpr.kt index 254ae454d8..7d9f7f8679 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/NeqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/NeqExpr.kt @@ -1,39 +1,28 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.abstracttype; - -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import hu.bme.mit.theta.core.type.BinaryExpr; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.booltype.BoolType; +package hu.bme.mit.theta.core.type.abstracttype -public abstract class NeqExpr> - extends BinaryExpr { +import hu.bme.mit.theta.core.type.BinaryExpr +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.Serializable - protected NeqExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - } +/** + * Abstract base class for not-equal (!=) expressions over equational types. + */ +@Serializable +abstract class NeqExpr> : BinaryExpr() { - public static > NeqExpr create2( - final Expr leftOp, final Expr rightOp) { - @SuppressWarnings("unchecked") - final OpType type = (OpType) leftOp.getType(); - final Expr newLeftOp = cast(leftOp, type); - final Expr newRightOp = cast(rightOp, type); - return type.Neq(newLeftOp, newRightOp); + companion object { + @JvmStatic + fun > create2( + leftOp: Expr<*>, + rightOp: Expr<*> + ): NeqExpr<*> { + @Suppress("UNCHECKED_CAST") + val type = leftOp.type as OpType + val newLeftOp = cast(leftOp, type) + val newRightOp = cast(rightOp, type) + return type.Neq(newLeftOp, newRightOp) + } } } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Ordered.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Ordered.kt index a7b92e743d..d6ba175cf8 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Ordered.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Ordered.kt @@ -1,30 +1,17 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.abstracttype; - -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.Type; - -public interface Ordered> extends Type { - - LtExpr Lt(Expr leftOp, Expr rightOp); +package hu.bme.mit.theta.core.type.abstracttype - LeqExpr Leq(Expr leftOp, Expr rightOp); +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.Type +import kotlinx.serialization.Polymorphic - GtExpr Gt(Expr leftOp, Expr rightOp); - - GeqExpr Geq(Expr leftOp, Expr rightOp); +/** + * Represents a type that supports ordering and comparison operations. + */ +@Polymorphic +interface Ordered> : Type { + fun Lt(leftOp: Expr, rightOp: Expr): LtExpr + fun Leq(leftOp: Expr, rightOp: Expr): LeqExpr + fun Gt(leftOp: Expr, rightOp: Expr): GtExpr + fun Geq(leftOp: Expr, rightOp: Expr): GeqExpr } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/PosExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/PosExpr.kt index 7ea1cfc0e2..f151d2eae9 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/PosExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/PosExpr.kt @@ -1,36 +1,26 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.abstracttype; - -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.UnaryExpr; +package hu.bme.mit.theta.core.type.abstracttype -public abstract class PosExpr> - extends UnaryExpr { +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.UnaryExpr +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.Serializable - protected PosExpr(final Expr op) { - super(op); - } +/** + * Abstract base class for positive (unary plus) expressions over additive types. + */ +@Serializable +abstract class PosExpr> : UnaryExpr() { - public static > PosExpr create2(final Expr op) { - @SuppressWarnings("unchecked") - final ExprType type = (ExprType) op.getType(); - final Expr newOp = cast(op, type); - return type.Pos(newOp); + companion object { + @JvmStatic + fun > create2( + op: Expr<*> + ): PosExpr<*> { + @Suppress("UNCHECKED_CAST") + val type = op.type as ExprType + val newOp = cast(op, type) + return type.Pos(newOp) + } } } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/RemExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/RemExpr.kt index b93e4864e4..a6dd0418ce 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/RemExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/RemExpr.kt @@ -1,38 +1,28 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.abstracttype; - -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import hu.bme.mit.theta.core.type.BinaryExpr; -import hu.bme.mit.theta.core.type.Expr; +package hu.bme.mit.theta.core.type.abstracttype -public abstract class RemExpr> - extends BinaryExpr { +import hu.bme.mit.theta.core.type.BinaryExpr +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.Serializable - protected RemExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - } +/** + * Abstract base class for remainder expressions over divisible types. + */ +@Serializable +abstract class RemExpr> : BinaryExpr() { - public static > RemExpr create2( - final Expr leftOp, final Expr rightOp) { - @SuppressWarnings("unchecked") - final ExprType type = (ExprType) leftOp.getType(); - final Expr newLeftOp = cast(leftOp, type); - final Expr newRightOp = cast(rightOp, type); - return type.Rem(newLeftOp, newRightOp); + companion object { + @JvmStatic + fun > create2( + leftOp: Expr<*>, + rightOp: Expr<*> + ): RemExpr<*> { + @Suppress("UNCHECKED_CAST") + val type = leftOp.type as ExprType + val newLeftOp = cast(leftOp, type) + val newRightOp = cast(rightOp, type) + return type.Rem(newLeftOp, newRightOp) + } } } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/SubExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/SubExpr.kt index a263048118..79c9e76adb 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/SubExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/SubExpr.kt @@ -1,38 +1,28 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.abstracttype; - -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import hu.bme.mit.theta.core.type.BinaryExpr; -import hu.bme.mit.theta.core.type.Expr; +package hu.bme.mit.theta.core.type.abstracttype -public abstract class SubExpr> - extends BinaryExpr { +import hu.bme.mit.theta.core.type.BinaryExpr +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.Serializable - protected SubExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - } +/** + * Abstract base class for subtraction expressions over additive types. + */ +@Serializable +abstract class SubExpr> : BinaryExpr() { - public static > SubExpr create2( - final Expr leftOp, final Expr rightOp) { - @SuppressWarnings("unchecked") - final ExprType type = (ExprType) leftOp.getType(); - final Expr newLeftOp = cast(leftOp, type); - final Expr newRightOp = cast(rightOp, type); - return type.Sub(newLeftOp, newRightOp); + companion object { + @JvmStatic + fun > create2( + leftOp: Expr<*>, + rightOp: Expr<*> + ): SubExpr<*> { + @Suppress("UNCHECKED_CAST") + val type = leftOp.type as ExprType + val newLeftOp = cast(leftOp, type) + val newRightOp = cast(rightOp, type) + return type.Sub(newLeftOp, newRightOp) + } } } + From f1dc0d36f68671007382644c76b2d207fbdb9d22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Csan=C3=A1d=20Telbisz?= Date: Fri, 20 Jun 2025 11:10:06 +0200 Subject: [PATCH 05/48] Rename .java to .kt --- .../hu/bme/mit/theta/core/type/anytype/{Exprs.java => Exprs.kt} | 0 .../core/type/arraytype/{ArrayEqExpr.java => ArrayEqExpr.kt} | 0 .../theta/core/type/arraytype/{ArrayExprs.java => ArrayExprs.kt} | 0 .../core/type/arraytype/{ArrayInitExpr.java => ArrayInitExpr.kt} | 0 .../core/type/arraytype/{ArrayLitExpr.java => ArrayLitExpr.kt} | 0 .../core/type/arraytype/{ArrayNeqExpr.java => ArrayNeqExpr.kt} | 0 .../core/type/arraytype/{ArrayReadExpr.java => ArrayReadExpr.kt} | 0 .../theta/core/type/arraytype/{ArrayType.java => ArrayType.kt} | 0 .../type/arraytype/{ArrayWriteExpr.java => ArrayWriteExpr.kt} | 0 9 files changed, 0 insertions(+), 0 deletions(-) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/{Exprs.java => Exprs.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/{ArrayEqExpr.java => ArrayEqExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/{ArrayExprs.java => ArrayExprs.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/{ArrayInitExpr.java => ArrayInitExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/{ArrayLitExpr.java => ArrayLitExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/{ArrayNeqExpr.java => ArrayNeqExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/{ArrayReadExpr.java => ArrayReadExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/{ArrayType.java => ArrayType.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/{ArrayWriteExpr.java => ArrayWriteExpr.kt} (100%) diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/Exprs.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/Exprs.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/Exprs.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/Exprs.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayEqExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayEqExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayEqExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayEqExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayExprs.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayExprs.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayExprs.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayExprs.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayInitExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayInitExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayInitExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayInitExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayLitExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayLitExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayLitExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayLitExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayNeqExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayNeqExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayNeqExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayNeqExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayReadExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayReadExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayReadExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayReadExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayType.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayType.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayType.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayType.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayWriteExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayWriteExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayWriteExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayWriteExpr.kt From 9711b9de58a1657046f738fcca127e8d2fe1a856 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Csan=C3=A1d=20Telbisz?= Date: Fri, 20 Jun 2025 11:10:08 +0200 Subject: [PATCH 06/48] convert to serializable - arraytype --- .../hu/bme/mit/theta/core/type/BinaryExpr.kt | 29 ++- .../java/hu/bme/mit/theta/core/type/Expr.kt | 1 + .../bme/mit/theta/core/type/MultiaryExpr.kt | 7 +- .../bme/mit/theta/core/type/anytype/Exprs.kt | 91 ++++--- .../theta/core/type/arraytype/ArrayEqExpr.kt | 150 ++++------- .../theta/core/type/arraytype/ArrayExprs.kt | 128 ++++------ .../core/type/arraytype/ArrayInitExpr.kt | 224 ++++++---------- .../theta/core/type/arraytype/ArrayLitExpr.kt | 188 ++++---------- .../theta/core/type/arraytype/ArrayNeqExpr.kt | 152 ++++------- .../core/type/arraytype/ArrayReadExpr.kt | 208 +++++---------- .../theta/core/type/arraytype/ArrayType.kt | 135 +++------- .../core/type/arraytype/ArrayWriteExpr.kt | 239 +++++------------- 12 files changed, 518 insertions(+), 1034 deletions(-) diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/BinaryExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/BinaryExpr.kt index b57c3ff791..0a6cd6f300 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/BinaryExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/BinaryExpr.kt @@ -31,10 +31,10 @@ abstract class BinaryExpr : Expr { protected abstract val leftOp: Expr protected abstract val rightOp: Expr - override val arity: Int get() = 2 - override val ops: List> get() = listOf(leftOp, rightOp) + abstract val operatorLabel: String + override fun withOps(ops: List>): Expr { require(ops.size == 2) { "Operands must have size 2 for binary expression" } val opType = leftOp.type @@ -43,19 +43,22 @@ abstract class BinaryExpr : Expr { return with(newLeftOp, newRightOp) } - override fun toString(): String { - return Utils.lispStringBuilder(getOperatorLabel()) - .body() - .add(leftOp) - .add(rightOp) - .toString() - } + fun with(leftOp: Expr, rightOp: Expr): BinaryExpr = + if (leftOp == this.leftOp && rightOp == this.rightOp) { + this + } else { + of(leftOp, rightOp) + } - abstract fun with(leftOp: Expr, rightOp: Expr): BinaryExpr + protected abstract fun of(leftOp: Expr, rightOp: Expr): BinaryExpr - abstract fun withLeftOp(leftOp: Expr): BinaryExpr + open fun withLeftOp(leftOp: Expr): BinaryExpr = with(leftOp, rightOp) - abstract fun withRightOp(rightOp: Expr): BinaryExpr + open fun withRightOp(rightOp: Expr): BinaryExpr = with(leftOp, rightOp) - abstract fun getOperatorLabel(): String + override fun toString(): String = Utils.lispStringBuilder(operatorLabel) + .body() + .add(leftOp) + .add(rightOp) + .toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/Expr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/Expr.kt index 49bdab4328..4de250ccaf 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/Expr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/Expr.kt @@ -31,6 +31,7 @@ interface Expr { * Returns the arity (number of operands) of this expression. */ val arity: Int + get() = ops.size /** * Returns the type of this expression. diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/MultiaryExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/MultiaryExpr.kt index bb78a53b51..12a083f3e3 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/MultiaryExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/MultiaryExpr.kt @@ -30,8 +30,7 @@ abstract class MultiaryExpr : Expr { abstract override val ops: List> - override val arity: Int - get() = ops.size + abstract val operatorLabel: String override fun withOps(ops: List>): MultiaryExpr { if (ops.isEmpty()) { @@ -43,9 +42,7 @@ abstract class MultiaryExpr : Expr { } } - override fun toString(): String = Utils.lispStringBuilder(getOperatorLabel()).body().addAll(ops).toString() + override fun toString(): String = Utils.lispStringBuilder(operatorLabel).body().addAll(ops).toString() abstract fun with(ops: Iterable>): MultiaryExpr - - abstract fun getOperatorLabel(): String } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/Exprs.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/Exprs.kt index cea816fb2e..68c58f7389 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/Exprs.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/Exprs.kt @@ -13,56 +13,51 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.anytype; +package hu.bme.mit.theta.core.type.anytype -import static com.google.common.base.Preconditions.checkArgument; +import hu.bme.mit.theta.core.decl.Decl +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.Type +import hu.bme.mit.theta.core.type.booltype.BoolType -import hu.bme.mit.theta.core.decl.Decl; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.Type; -import hu.bme.mit.theta.core.type.booltype.BoolType; - -public final class Exprs { - - private Exprs() {} - - public static RefExpr Ref(final Decl decl) { - return RefExpr.of(decl); - } - - public static IteExpr Ite( - final Expr cond, final Expr then, final Expr elze) { - return IteExpr.of(cond, then, elze); - } - - public static PrimeExpr Prime(final Expr op) { - return PrimeExpr.of(op); - } - - public static - Dereference Dereference( - final Expr arr, final Expr offset, final ExprType type) { - return Dereference.of(arr, offset, type); - } - - public static - Reference Reference(final Expr expr, final ArrType type) { - return Reference.of(expr, type); - } - - /* - * Convenience methods - */ - - public static Expr Prime( - final Expr op, final int i) { - checkArgument(i >= 0); - if (i == 0) { - return op; - } else if (i == 1) { - return Prime(op); - } else { - return Prime(Prime(op, i - 1)); +/** + * Factory and utility methods for any-type expressions. + */ +object Exprs { + fun Ref(decl: Decl): RefExpr = + RefExpr(decl) + + fun Ite( + cond: Expr, + then: Expr, + elze: Expr + ): IteExpr = + IteExpr(cond, then, elze) + + fun Prime(op: Expr): PrimeExpr = + PrimeExpr(op) + + fun Dereference( + arr: Expr, + offset: Expr, + type: ExprType + ): Dereference = + Dereference(arr, offset, type) + + fun Reference( + expr: Expr, + type: ArrType + ): Reference = + Reference(expr, type) + + // Convenience methods + fun Prime(op: Expr, i: Int): Expr { + require(i >= 0) + return when (i) { + 0 -> op + 1 -> Prime(op) + else -> Prime(Prime(op, i - 1)) } } } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayEqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayEqExpr.kt index 85990b461f..d0ee729f45 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayEqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayEqExpr.kt @@ -1,113 +1,67 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.arraytype; - -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.BinaryExpr; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.type.Type; -import hu.bme.mit.theta.core.type.abstracttype.EqExpr; -import hu.bme.mit.theta.core.type.booltype.BoolType; +package hu.bme.mit.theta.core.type.arraytype -public final class ArrayEqExpr - extends EqExpr> { +import hu.bme.mit.theta.common.Utils +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.BinaryExpr +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.type.Type +import hu.bme.mit.theta.core.type.abstracttype.EqExpr +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool +import hu.bme.mit.theta.core.type.booltype.BoolType +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable - private static final int HASH_SEED = 4261; - private static final String OPERATOR_LABEL = "="; - - private ArrayEqExpr( - final Expr> leftOp, - final Expr> rightOp) { - super(leftOp, rightOp); - } +/** + * Equality expression for array types. + */ +@Serializable +@SerialName("ArrayEqExpr") +data class ArrayEqExpr( + override val leftOp: Expr>, + override val rightOp: Expr> +) : EqExpr>() { - public static - ArrayEqExpr of( - final Expr> leftOp, - final Expr> rightOp) { - return new ArrayEqExpr<>(leftOp, rightOp); - } + companion object { - public static ArrayEqExpr create( - final Expr leftOp, final Expr rightOp) { - @SuppressWarnings("unchecked") - final ArrayType arrayType = - (ArrayType) leftOp.getType(); - final Expr> newLeftOp = cast(leftOp, arrayType); - final Expr> newRightOp = cast(rightOp, arrayType); - return ArrayEqExpr.of(newLeftOp, newRightOp); - } + private const val OPERATOR_LABEL = "=" - @Override - public BoolType getType() { - return Bool(); - } + fun of( + leftOp: Expr>, + rightOp: Expr> + ) = ArrayEqExpr(leftOp, rightOp) - @Override - public LitExpr eval(final Valuation val) { - throw new UnsupportedOperationException(); - } - - @Override - public BinaryExpr, BoolType> with( - final Expr> leftOp, - final Expr> rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return ArrayEqExpr.of(leftOp, rightOp); + fun create( + leftOp: Expr<*>, rightOp: Expr<*> + ): ArrayEqExpr<*, *> { + @Suppress("UNCHECKED_CAST") + val arrayType = leftOp.type as ArrayType + val newLeftOp = cast(leftOp, arrayType) + val newRightOp = cast(rightOp, arrayType) + return of(newLeftOp, newRightOp) } } - @Override - public BinaryExpr, BoolType> withLeftOp( - final Expr> leftOp) { - return with(leftOp, getRightOp()); - } + override val type: BoolType + get() = Bool() - @Override - public BinaryExpr, BoolType> withRightOp( - final Expr> rightOp) { - return with(getLeftOp(), rightOp); - } + override fun eval(`val`: Valuation): LitExpr = throw UnsupportedOperationException() - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final ArrayEqExpr that = (ArrayEqExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } + override fun of( + leftOp: Expr>, + rightOp: Expr> + ): BinaryExpr, BoolType> = + ArrayEqExpr(leftOp, rightOp) - @Override - protected int getHashSeed() { - return HASH_SEED; - } + override val operatorLabel: String = OPERATOR_LABEL - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; + override fun toString(): String { + return Utils.lispStringBuilder(operatorLabel) + .body() + .add(leftOp) + .add(rightOp) + .toString() } } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayExprs.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayExprs.kt index 077bb661eb..3cf0126b6e 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayExprs.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayExprs.kt @@ -1,76 +1,58 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.arraytype; - -import hu.bme.mit.theta.common.Tuple2; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.Type; -import java.util.List; - -public final class ArrayExprs { - - private ArrayExprs() {} - - public static - ArrayType Array( - final IndexType indexType, final ElemType elemType) { - return ArrayType.of(indexType, elemType); - } - - public static - ArrayLitExpr Array( - final List, ? extends Expr>> elems, - final Expr elseElem, - final ArrayType type) { - return ArrayLitExpr.of(elems, elseElem, type); - } +package hu.bme.mit.theta.core.type.arraytype - public static - ArrayInitExpr ArrayInit( - final List, Expr>> elems, - final Expr elseElem, - final ArrayType type) { - return ArrayInitExpr.of(elems, elseElem, type); - } +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.Type +import kotlinx.serialization.Serializable - public static - ArrayReadExpr Read( - final Expr> array, final Expr index) { - return ArrayReadExpr.of(array, index); - } - - public static - ArrayWriteExpr Write( - final Expr> array, - final Expr index, - final Expr elem) { - return ArrayWriteExpr.of(array, index, elem); - } - - public static - ArrayEqExpr Eq( - final Expr> leftOp, - final Expr> rightOp) { - return ArrayEqExpr.of(leftOp, rightOp); - } - - public static - ArrayNeqExpr Neq( - final Expr> leftOp, - final Expr> rightOp) { - return ArrayNeqExpr.of(leftOp, rightOp); - } +/** + * Factory and utility methods for array-type expressions. + */ +@Serializable +object ArrayExprs { + + fun Array( + indexType: IndexType, + elemType: ElemType + ): ArrayType = + ArrayType(indexType, elemType) + + fun Array( + elements: List, Expr>>, + elseElem: Expr, + type: ArrayType + ): ArrayLitExpr = + ArrayLitExpr.of(elements, elseElem, type) + + fun ArrayInit( + elements: List, Expr>>, + elseElem: Expr, + type: ArrayType + ): ArrayInitExpr = + ArrayInitExpr(elements, elseElem, type) + + fun Read( + array: Expr>, + index: Expr + ): ArrayReadExpr = + ArrayReadExpr(array, index) + + fun Write( + array: Expr>, + index: Expr, + elem: Expr + ): ArrayWriteExpr = + ArrayWriteExpr(array, index, elem) + + fun Eq( + leftOp: Expr>, + rightOp: Expr> + ): ArrayEqExpr = + ArrayEqExpr(leftOp, rightOp) + + fun Neq( + leftOp: Expr>, + rightOp: Expr> + ): ArrayNeqExpr = + ArrayNeqExpr(leftOp, rightOp) } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayInitExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayInitExpr.kt index cb4c601a4e..4f8f286a1b 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayInitExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayInitExpr.kt @@ -1,35 +1,12 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.arraytype; - -import static com.google.common.base.Preconditions.checkNotNull; -import static com.google.common.base.Preconditions.checkState; +package hu.bme.mit.theta.core.type.arraytype -import com.google.common.collect.ImmutableList; -import hu.bme.mit.theta.common.Tuple2; -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.type.MultiaryExpr; -import hu.bme.mit.theta.core.type.Type; -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.Stream; -import java.util.stream.StreamSupport; +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.type.MultiaryExpr +import hu.bme.mit.theta.core.type.Type +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable /** * ArrayInitExpr is a way to specify arbitrary array 'literals' that may contain non-literal @@ -39,132 +16,77 @@ import java.util.stream.StreamSupport; * `elseElem` are mapped to `ops` by first placing the `elseElem`, then all indices, then all * elements. */ -public final class ArrayInitExpr - extends MultiaryExpr> { - - private static final int HASH_SEED = 241; - private static final String OPERATOR_LABEL = "arrayinit"; - - private final ArrayType type; - - private final List, Expr>> elems; - - private final Expr elseElem; - - private ArrayInitExpr( - final List, Expr>> elems, - final Expr elseElem, - final ArrayType type) { - //noinspection unchecked - super( - Stream.concat( - List.of((Expr) elseElem).stream(), - Stream.concat( - elems.stream().map(objects -> (Expr) objects.get1()), - elems.stream().map(objects -> (Expr) objects.get2()))) - .collect(Collectors.toList())); - this.type = checkNotNull(type); - this.elseElem = checkNotNull(elseElem); - this.elems = checkNotNull(elems); - } - - public static - ArrayInitExpr of( - final List, Expr>> elems, - final Expr elseElem, - final ArrayType type) { - return new ArrayInitExpr<>(elems, elseElem, type); - } - - public static - ArrayInitExpr create( - final List, Expr>> elems, - final Expr elseElem, - final ArrayType type) { - final List, Expr>> typedElems = - elems.stream() - .map(i -> Tuple2.of((Expr) i.get1(), (Expr) i.get2())) - .collect(Collectors.toList()); - final Expr typedElseElem = (Expr) elseElem; - final ArrayType typedType = (ArrayType) type; - return of(typedElems, typedElseElem, typedType); - } - - public List, Expr>> getElements() { - return ImmutableList.copyOf(elems); +@Serializable +@SerialName(ArrayInitExpr.OPERATOR_LABEL) +data class ArrayInitExpr( + val elements: List, Expr>>, + val elseElem: Expr, + override val type: ArrayType +) : MultiaryExpr>() { + + @Suppress("UNCHECKED_CAST") + override val ops: List> = + listOf(elseElem as Expr) + + elements.map { it.first as Expr } + + elements.map { it.second as Expr } + + companion object { + + internal const val OPERATOR_LABEL = "arrayinit" + + fun of( + elems: List, Expr>>, + elseElem: Expr, + type: ArrayType + ) = ArrayInitExpr(elems, elseElem, type) + + @Suppress("UNCHECKED_CAST") + fun create( + elems: List, Expr>>, + elseElem: Expr<*>, + type: ArrayType<*, *> + ): ArrayInitExpr = + of( + elems.map { Pair(it.first as Expr, it.second as Expr) }, + elseElem as Expr, + type as ArrayType + ) } - public Expr getElseElem() { - return elseElem; - } - - @Override - public ArrayType getType() { - return type; - } - - @Override - public LitExpr> eval(final Valuation val) { - return ArrayLitExpr.of( - elems.stream() - .map( - objects -> - Tuple2.of( - objects.get1().eval(val), objects.get2().eval(val))) - .collect(Collectors.toList()), - elseElem, - type); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final ArrayInitExpr that = (ArrayInitExpr) obj; - return this.type.equals(that.type) - && this.elems.equals(that.elems) - && elseElem.equals(that.elseElem); - } else { - return false; + override fun eval(`val`: Valuation): LitExpr> = + ArrayLitExpr.of( + elements.map { Pair(it.first.eval(`val`), it.second.eval(`val`)) }, + elseElem, + type + ) + + @Suppress("UNCHECKED_CAST") + override fun with(ops: Iterable>): MultiaryExpr> { + val size = ops.count() + require(size % 2 == 1) { "Ops must be odd long!" } + val elseElem: Expr = ops.first() as Expr + val indices = mutableListOf>() + val elems = mutableListOf>() + ops.forEachIndexed { counter, op -> + when { + counter == 0 -> {} + counter <= (size - 1) / 2 -> indices.add(op as Expr) + else -> elems.add(op as Expr) + } } - } - - @SuppressWarnings("unchecked") - @Override - public MultiaryExpr> with( - Iterable> ops) { - long size = StreamSupport.stream(ops.spliterator(), false).count(); - checkState(size % 2 == 1, "Ops must be odd long!"); - long counter = 0; - Expr elseElem = null; - List> indices = new ArrayList<>(); - List> elems = new ArrayList<>(); - for (Expr op : ops) { - if (counter == 0) elseElem = (Expr) op; - else if (counter <= (size - 1) / 2) indices.add((Expr) op); - else elems.add((Expr) op); - ++counter; - } - List, Expr>> newOps = new ArrayList<>(); - for (int i = 0; i < indices.size(); i++) { - newOps.add(Tuple2.of(indices.get(i), elems.get(i))); + val newOps = indices.indices.map { i -> + indices[i] to elems[i] } - return ArrayInitExpr.of(newOps, elseElem, type); + return of(newOps, elseElem, type) } - @Override - public MultiaryExpr> withOps(List> ops) { - return with(ops.stream().map(op -> (Expr) op).collect(Collectors.toList())); - } + @Suppress("UNCHECKED_CAST") + override fun withOps(ops: List>): MultiaryExpr> = + with(ops.map { it as Expr }) - @Override - protected int getHashSeed() { - return HASH_SEED; - } + override val operatorLabel: String = OPERATOR_LABEL - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } + override fun toString(): String = + "arrayinit($elements, $elseElem, $type)" } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayLitExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayLitExpr.kt index df077122fc..f2a8991955 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayLitExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayLitExpr.kt @@ -1,145 +1,57 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. +package hu.bme.mit.theta.core.type.arraytype + +import hu.bme.mit.theta.common.Utils +import hu.bme.mit.theta.core.model.ImmutableValuation +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.type.NullaryExpr +import hu.bme.mit.theta.core.type.Type +import hu.bme.mit.theta.core.utils.ExprSimplifier +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +/** + * Literal array expression for array types, containing only literal values. */ -package hu.bme.mit.theta.core.type.arraytype; - -import static com.google.common.base.Preconditions.checkNotNull; -import static com.google.common.base.Preconditions.checkState; - -import com.google.common.collect.ImmutableList; -import hu.bme.mit.theta.common.Tuple2; -import hu.bme.mit.theta.common.Utils; -import hu.bme.mit.theta.core.model.ImmutableValuation; -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.type.NullaryExpr; -import hu.bme.mit.theta.core.type.Type; -import hu.bme.mit.theta.core.utils.ExprSimplifier; -import java.util.List; -import java.util.stream.Collectors; - -public final class ArrayLitExpr - extends NullaryExpr> - implements LitExpr> { - - private static final int HASH_SEED = 229; - private static final String OPERATOR_LABEL = "array"; - - private final ArrayType type; - - private final List, LitExpr>> elems; - - private final LitExpr elseElem; - - private volatile int hashCode; - - private ArrayLitExpr( - final List, ? extends Expr>> elems, - final Expr elseElem, - final ArrayType type) { - this.type = checkNotNull(type); - final ExprSimplifier exprSimplifier = ExprSimplifier.create(); - Expr simplifiedElem = - exprSimplifier.simplify(checkNotNull(elseElem), ImmutableValuation.empty()); - checkState( - simplifiedElem instanceof LitExpr, - "ArrayLitExprs shall only contain literal values!"); - this.elseElem = (LitExpr) simplifiedElem; - this.elems = - checkNotNull(elems).stream() - .map( - elem -> { - Expr index = - exprSimplifier.simplify( - elem.get1(), ImmutableValuation.empty()); - Expr element = - exprSimplifier.simplify( - elem.get2(), ImmutableValuation.empty()); - checkState( - index instanceof LitExpr && element instanceof LitExpr, - "ArrayLitExprs shall only contain literal values"); - return Tuple2.of( - (LitExpr) index, - (LitExpr) element); - }) - .collect(Collectors.toList()); - } - - public static - ArrayLitExpr of( - final List, ? extends Expr>> elems, - final Expr elseElem, - final ArrayType type) { - return new ArrayLitExpr<>(elems, elseElem, type); - } - - public List, LitExpr>> getElements() { - return ImmutableList.copyOf(elems); - } - - public LitExpr getElseElem() { - return elseElem; - } - - @Override - public ArrayType getType() { - return type; - } - - @Override - public LitExpr> eval(final Valuation val) { - return this; - } - - @Override - public int hashCode() { - int tmp = hashCode; - if (tmp == 0) { - tmp = HASH_SEED; - tmp = 31 * tmp + type.hashCode(); - for (Tuple2, LitExpr> elem : elems) { - tmp = 31 * tmp + elem.hashCode(); +@Serializable +@SerialName("ArrayLitExpr") +data class ArrayLitExpr private constructor( + val elements: List, LitExpr>>, + val elseElem: LitExpr, + override val type: ArrayType +) : NullaryExpr>(), LitExpr> { + + companion object { + + private const val OPERATOR_LABEL = "array" + + fun of( + elems: List, Expr>>, + elseElem: Expr, + type: ArrayType + ): ArrayLitExpr { + val simplifier = ExprSimplifier.create() + val simplifiedElse = simplifier.simplify(elseElem, ImmutableValuation.empty()) + require(simplifiedElse is LitExpr<*>) { "ArrayLitExprs shall only contain literal values!" } + val litElse = simplifiedElse as LitExpr + val litElems = elems.map { + val idx = simplifier.simplify(it.first, ImmutableValuation.empty()) + val elem = simplifier.simplify(it.second, ImmutableValuation.empty()) + require(idx is LitExpr<*> && elem is LitExpr<*>) { "ArrayLitExprs shall only contain literal values!" } + Pair(idx as LitExpr, elem as LitExpr) } - hashCode = tmp; + return ArrayLitExpr(litElems, litElse, type) } - return tmp; } - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final ArrayLitExpr that = (ArrayLitExpr) obj; - return this.type.equals(that.type) - && this.elems.equals(that.elems) - && elseElem.equals(that.elseElem); - } else { - return false; - } - } + override fun eval(`val`: Valuation): LitExpr> = this - @Override - public String toString() { - return Utils.lispStringBuilder(OPERATOR_LABEL) - .body() - .addAll( - elems.stream() - .map(elem -> String.format("(%s %s)", elem.get1(), elem.get2()))) - .add((String.format("(default %s)", elseElem))) - .toString(); - } + override fun toString(): String = + Utils.lispStringBuilder(OPERATOR_LABEL) + .body() + .addAll(elements.map { "(${it.first} ${it.second})" }) + .add("(default $elseElem)") + .toString() } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayNeqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayNeqExpr.kt index 86a4961787..87db20231c 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayNeqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayNeqExpr.kt @@ -1,113 +1,65 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.arraytype; - -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.BinaryExpr; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.type.Type; -import hu.bme.mit.theta.core.type.abstracttype.NeqExpr; -import hu.bme.mit.theta.core.type.booltype.BoolType; - -public final class ArrayNeqExpr - extends NeqExpr> { - - private static final int HASH_SEED = 5233; - private static final String OPERATOR_LABEL = "/="; - - private ArrayNeqExpr( - final Expr> leftOp, - final Expr> rightOp) { - super(leftOp, rightOp); - } - - public static - ArrayNeqExpr of( - final Expr> leftOp, - final Expr> rightOp) { - return new ArrayNeqExpr<>(leftOp, rightOp); - } +package hu.bme.mit.theta.core.type.arraytype - public static ArrayNeqExpr create( - final Expr leftOp, final Expr rightOp) { - @SuppressWarnings("unchecked") - final ArrayType arrayType = - (ArrayType) leftOp.getType(); - final Expr> newLeftOp = cast(leftOp, arrayType); - final Expr> newRightOp = cast(rightOp, arrayType); - return ArrayNeqExpr.of(newLeftOp, newRightOp); - } +import hu.bme.mit.theta.common.Utils +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.BinaryExpr +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.type.Type +import hu.bme.mit.theta.core.type.abstracttype.NeqExpr +import hu.bme.mit.theta.core.type.arraytype.ArrayEqExpr.Companion +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool +import hu.bme.mit.theta.core.type.booltype.BoolType +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable - @Override - public BoolType getType() { - return Bool(); - } +/** + * Not-equal expression for array types. + */ +@Serializable +@SerialName("ArrayNeqExpr") +data class ArrayNeqExpr( + override val leftOp: Expr>, + override val rightOp: Expr> +) : NeqExpr>() { - @Override - public LitExpr eval(final Valuation val) { - throw new UnsupportedOperationException(); - } + companion object { + private const val OPERATOR_LABEL = "/=" + fun of( + leftOp: Expr>, + rightOp: Expr> + ) = ArrayNeqExpr(leftOp, rightOp) - @Override - public BinaryExpr, BoolType> with( - final Expr> leftOp, - final Expr> rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return new ArrayNeqExpr<>(leftOp, rightOp); + fun create( + leftOp: Expr<*>, rightOp: Expr<*> + ): ArrayNeqExpr<*, *> { + @Suppress("UNCHECKED_CAST") + val arrayType = leftOp.type as ArrayType + val newLeftOp = cast(leftOp, arrayType) + val newRightOp = cast(rightOp, arrayType) + return of(newLeftOp, newRightOp) } } - @Override - public BinaryExpr, BoolType> withLeftOp( - final Expr> leftOp) { - return with(leftOp, getRightOp()); - } + override val type: BoolType + get() = Bool() - @Override - public BinaryExpr, BoolType> withRightOp( - final Expr> rightOp) { - return with(getLeftOp(), rightOp); - } + override fun eval(`val`: Valuation): LitExpr = throw UnsupportedOperationException() - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final ArrayNeqExpr that = (ArrayNeqExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } + override fun of( + leftOp: Expr>, + rightOp: Expr> + ): BinaryExpr, BoolType> = + ArrayNeqExpr(leftOp, rightOp) - @Override - protected int getHashSeed() { - return HASH_SEED; - } + override val operatorLabel: String = OPERATOR_LABEL - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; + override fun toString(): String { + return Utils.lispStringBuilder(operatorLabel) + .body() + .add(leftOp) + .add(rightOp) + .toString() } } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayReadExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayReadExpr.kt index fddd4141c3..23ec8ca417 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayReadExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayReadExpr.kt @@ -1,158 +1,82 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. +package hu.bme.mit.theta.core.type.arraytype + +import hu.bme.mit.theta.common.Utils +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.type.Type +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +/** + * Read expression for array types. */ -package hu.bme.mit.theta.core.type.arraytype; - -import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.base.Preconditions.checkNotNull; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import com.google.common.collect.ImmutableList; -import hu.bme.mit.theta.common.Tuple2; -import hu.bme.mit.theta.common.Utils; -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.type.Type; -import java.util.List; - -public final class ArrayReadExpr - implements Expr { - - private static final int HASH_SEED = 1321; - - private static final String OPERATOR_LABEL = "read"; - - private volatile int hashCode = 0; - - private final Expr> array; - private final Expr index; - - private ArrayReadExpr( - final Expr> array, final Expr index) { - this.array = checkNotNull(array); - this.index = checkNotNull(index); - } - - public static - ArrayReadExpr of( - final Expr> array, final Expr index) { - return new ArrayReadExpr<>(array, index); - } - - public static ArrayReadExpr create( - final Expr array, final Expr index) { - @SuppressWarnings("unchecked") - final ArrayType arrayType = - (ArrayType) array.getType(); - final Expr> newArray = cast(array, arrayType); - final Expr newIndex = cast(index, arrayType.getIndexType()); - return ArrayReadExpr.of(newArray, newIndex); - } - - public Expr> getArray() { - return array; - } - - public Expr getIndex() { - return index; - } - - @Override - public ElemType getType() { - return array.getType().getElemType(); - } - - @Override - public LitExpr eval(final Valuation val) { - ArrayLitExpr arrayVal = - (ArrayLitExpr) array.eval(val); - LitExpr indexVal = index.eval(val); - for (Tuple2, LitExpr> elem : arrayVal.getElements()) { - if (elem.get1().equals(indexVal)) { - return elem.get2(); - } +@Serializable +@SerialName("ArrayReadExpr") +data class ArrayReadExpr( + val array: Expr>, + val index: Expr +) : Expr { + + companion object { + + private const val OPERATOR_LABEL = "read" + + fun of( + array: Expr>, + index: Expr + ) = ArrayReadExpr(array, index) + + @Suppress("UNCHECKED_CAST") + fun create( + array: Expr<*>, + index: Expr<*> + ): ArrayReadExpr { + val arrayType = array.type as ArrayType + val newArray = cast(array, arrayType) + val newIndex = cast(index, arrayType.indexType) + return of(newArray, newIndex) } - return (LitExpr) arrayVal.getElseElem(); } - @Override - public int getArity() { - return 2; - } + override val ops: List> + get() = listOf(array, index) - @Override - public List> getOps() { - return ImmutableList.of(array, index); - } + override val type: ElemType = array.type.elemType - @Override - public Expr withOps(final List> ops) { - checkNotNull(ops); - checkArgument(ops.size() == 2); - final Expr> newArray = cast(ops.get(0), array.getType()); - final Expr newIndex = cast(ops.get(1), index.getType()); - return with(newArray, newIndex); - } - - public ArrayReadExpr with( - final Expr> array, final Expr index) { - if (this.array == array && this.index == index) { - return this; - } else { - return ArrayReadExpr.of(array, index); + override fun eval(`val`: Valuation): LitExpr { + val arrayVal = array.eval(`val`) as ArrayLitExpr + val indexVal = index.eval(`val`) + arrayVal.elements.forEach { elem -> + if (elem.first == indexVal) return elem.second } + return arrayVal.elseElem } - public ArrayReadExpr withArray( - final Expr> array) { - return with(array, getIndex()); + override fun withOps(ops: List>): Expr { + require(ops.size == 2) + val newArray = cast(ops[0], array.type) + val newIndex = cast(ops[1], index.type) + return with(newArray, newIndex) } - public ArrayReadExpr withIndex(final Expr index) { - return with(getArray(), index); - } - - @Override - public int hashCode() { - int result = hashCode; - if (result == 0) { - result = HASH_SEED; - result = 31 * result + array.hashCode(); - result = 31 * result + index.hashCode(); - hashCode = result; + fun with( + array: Expr>, index: Expr + ): ArrayReadExpr = + if (this.array === array && this.index === index) { + this + } else { + of(array, index) } - return result; - } + fun withArray( + array: Expr> + ): ArrayReadExpr = with(array, index) - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final ArrayReadExpr that = (ArrayReadExpr) obj; - return this.getArray().equals(that.getArray()) - && this.getIndex().equals(that.getIndex()); - } else { - return false; - } - } + fun withIndex(index: Expr): ArrayReadExpr = with(array, index) - @Override - public String toString() { - return Utils.lispStringBuilder(OPERATOR_LABEL).body().add(array).add(index).toString(); - } + override fun toString(): String = + Utils.lispStringBuilder(OPERATOR_LABEL).body().add(array).add(index).toString() } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayType.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayType.kt index b6da9d0fad..24bcea1218 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayType.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayType.kt @@ -1,106 +1,49 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. +package hu.bme.mit.theta.core.type.arraytype + +import hu.bme.mit.theta.common.Utils +import hu.bme.mit.theta.core.type.DomainSize +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.Type +import hu.bme.mit.theta.core.type.abstracttype.EqExpr +import hu.bme.mit.theta.core.type.abstracttype.Equational +import hu.bme.mit.theta.core.type.abstracttype.NeqExpr +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +/** + * Represents an array type with a given index and element type. */ -package hu.bme.mit.theta.core.type.arraytype; +@Serializable +@SerialName(ArrayType.TYPE_LABEL) +data class ArrayType( + val indexType: IndexType, + val elemType: ElemType +) : Equational> { -import static com.google.common.base.Preconditions.checkNotNull; + companion object { -import hu.bme.mit.theta.common.Utils; -import hu.bme.mit.theta.core.type.DomainSize; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.Type; -import hu.bme.mit.theta.core.type.abstracttype.EqExpr; -import hu.bme.mit.theta.core.type.abstracttype.Equational; -import hu.bme.mit.theta.core.type.abstracttype.NeqExpr; + internal const val TYPE_LABEL = "Array" -public final class ArrayType - implements Equational> { - - private static final int HASH_SEED = 4919; - private static final String TYPE_LABEL = "Array"; - - private final IndexType indexType; - private final ElemType elemType; - - private volatile int hashCode = 0; - - private ArrayType(final IndexType indexType, final ElemType elemType) { - this.indexType = checkNotNull(indexType); - this.elemType = checkNotNull(elemType); - } - - public static ArrayType of( - final IndexType indexType, final ElemType elemType) { - return new ArrayType<>(indexType, elemType); + fun of( + indexType: IndexType, elemType: ElemType + ): ArrayType = + ArrayType(indexType, elemType) } - public IndexType getIndexType() { - return indexType; - } + override fun Eq( + leftOp: Expr>, + rightOp: Expr> + ): EqExpr> = ArrayExprs.Eq(leftOp, rightOp) - public ElemType getElemType() { - return elemType; - } + override fun Neq( + leftOp: Expr>, + rightOp: Expr> + ): NeqExpr> = ArrayExprs.Neq(leftOp, rightOp) - @Override - public EqExpr> Eq( - final Expr> leftOp, - final Expr> rightOp) { - return ArrayExprs.Eq(leftOp, rightOp); - } + override fun toString(): String = + Utils.lispStringBuilder(TYPE_LABEL).add("([${indexType}] -> $elemType)").toString() - @Override - public NeqExpr> Neq( - final Expr> leftOp, - final Expr> rightOp) { - return ArrayExprs.Neq(leftOp, rightOp); - } - - @Override - public int hashCode() { - int result = hashCode; - if (result == 0) { - result = HASH_SEED; - result = 31 * result + indexType.hashCode(); - result = 31 * result + elemType.hashCode(); - hashCode = result; - } - return result; - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final ArrayType that = (ArrayType) obj; - return this.getIndexType().equals(that.getIndexType()) - && this.getElemType().equals(that.getElemType()); - } else { - return false; - } - } - - @Override - public String toString() { - final String indexString = String.format("([%s] -> %s)", indexType, elemType); - return Utils.lispStringBuilder(TYPE_LABEL).add(indexString).toString(); - } - - @Override - public DomainSize getDomainSize() { - return DomainSize.pow(elemType.getDomainSize(), indexType.getDomainSize()); - } + override val domainSize: DomainSize + get() = DomainSize.pow(elemType.domainSize, indexType.domainSize) } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayWriteExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayWriteExpr.kt index c3a4a8a23c..6ee889f353 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayWriteExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayWriteExpr.kt @@ -1,185 +1,84 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. +package hu.bme.mit.theta.core.type.arraytype + +import hu.bme.mit.theta.common.Utils +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.type.Type +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +/** + * Write expression for array types. */ -package hu.bme.mit.theta.core.type.arraytype; - -import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.base.Preconditions.checkNotNull; -import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.Array; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import com.google.common.collect.ImmutableList; -import hu.bme.mit.theta.common.Tuple2; -import hu.bme.mit.theta.common.Utils; -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.type.Type; -import java.util.ArrayList; -import java.util.List; - -public final class ArrayWriteExpr - implements Expr> { - - private static final int HASH_SEED = 1699; - - private static final String OPERATOR_LABEL = "write"; - - private volatile int hashCode = 0; - - private final Expr> array; - private final Expr index; - private final Expr elem; - - private ArrayWriteExpr( - final Expr> array, - final Expr index, - final Expr elem) { - this.array = checkNotNull(array); - this.index = checkNotNull(index); - this.elem = checkNotNull(elem); - } - - public static - ArrayWriteExpr of( - final Expr> array, - final Expr index, - final Expr elem) { - return new ArrayWriteExpr<>(array, index, elem); - } - - public static ArrayWriteExpr create( - final Expr array, final Expr index, final Expr elem) { - @SuppressWarnings("unchecked") - final ArrayType arrayType = - (ArrayType) array.getType(); - final Expr> newArray = cast(array, arrayType); - final Expr newIndex = cast(index, arrayType.getIndexType()); - final Expr newElem = cast(elem, arrayType.getElemType()); - return ArrayWriteExpr.of(newArray, newIndex, newElem); - } - - public Expr> getArray() { - return array; - } - - public Expr getIndex() { - return index; - } - - public Expr getElem() { - return elem; - } - - @Override - public ArrayType getType() { - return Array(index.getType(), elem.getType()); - } - - @Override - public LitExpr> eval(final Valuation val) { - ArrayLitExpr arrayVal = - (ArrayLitExpr) array.eval(val); - LitExpr indexVal = index.eval(val); - LitExpr elemVal = elem.eval(val); - - List, ? extends Expr>> elemList = - new ArrayList<>(); - for (Tuple2, LitExpr> elem : arrayVal.getElements()) { - if (!elem.get1().equals(indexVal)) { - elemList.add(elem); - } +@Serializable +@SerialName("ArrayWriteExpr") +data class ArrayWriteExpr( + val array: Expr>, + val index: Expr, + val elem: Expr +) : Expr> { + + companion object { + + private const val OPERATOR_LABEL = "write" + + fun of( + array: Expr>, + index: Expr, + elem: Expr + ) = ArrayWriteExpr(array, index, elem) + + @Suppress("UNCHECKED_CAST") + fun create( + array: Expr<*>, + index: Expr<*>, + elem: Expr<*> + ): ArrayWriteExpr { + val arrayType = array.type as ArrayType + val newArray = cast(array, arrayType) + val newIndex = cast(index, arrayType.indexType) + val newElem = cast(elem, arrayType.elemType) + return of(newArray, newIndex, newElem) } - elemList.add(Tuple2.of(indexVal, elemVal)); - - return Array(elemList, arrayVal.getElseElem(), arrayVal.getType()); - } - - @Override - public int getArity() { - return 3; - } - - @Override - public List> getOps() { - return ImmutableList.of(array, index, elem); } - @Override - public Expr> withOps(final List> ops) { - checkNotNull(ops); - checkArgument(ops.size() == 3); - final Expr> newArray = cast(ops.get(0), array.getType()); - final Expr newIndex = cast(ops.get(1), index.getType()); - final Expr newElem = cast(ops.get(2), elem.getType()); - return with(newArray, newIndex, newElem); - } + override val ops: List> = listOf(array, index, elem) - public ArrayWriteExpr with( - final Expr> array, - final Expr index, - final Expr elem) { - if (this.array == array && this.index == index && elem == this.elem) { - return this; - } else { - return ArrayWriteExpr.of(array, index, elem); - } - } + override val type: ArrayType = ArrayType(index.type, elem.type) - public ArrayWriteExpr withIndex(final Expr index) { - return with(getArray(), index, getElem()); + override fun eval(`val`: Valuation): LitExpr> { + val arrayVal = array.eval(`val`) as ArrayLitExpr + val indexVal = index.eval(`val`) + val elemVal = elem.eval(`val`) + val elemList = arrayVal.elements.filter { it.first != indexVal } + Pair(indexVal, elemVal) + return ArrayLitExpr.of(elemList, arrayVal.elseElem, arrayVal.type) } - public ArrayWriteExpr withElem(final Expr elem) { - return with(getArray(), getIndex(), elem); - } + override fun toString(): String = + Utils.lispStringBuilder(OPERATOR_LABEL).body().add(array).add(index).add(elem).toString() - @Override - public int hashCode() { - int result = hashCode; - if (result == 0) { - result = HASH_SEED; - result = 31 * result + array.hashCode(); - result = 31 * result + index.hashCode(); - result = 31 * result + elem.hashCode(); - hashCode = result; - } - return result; + override fun withOps(ops: List>): ArrayWriteExpr { + require(ops.size == 3) + val newArray = cast(ops[0], array.type) + val newIndex = cast(ops[1], index.type) + val newElem = cast(ops[2], elem.type) + return with(newArray, newIndex, newElem) } - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final ArrayWriteExpr that = (ArrayWriteExpr) obj; - return this.getArray().equals(that.getArray()) - && this.getIndex().equals(that.getIndex()) - && this.getElem().equals(that.getElem()); + fun with( + array: Expr>, + index: Expr, + elem: Expr + ): ArrayWriteExpr = + if (this.array === array && this.index === index && this.elem === elem) { + this } else { - return false; + of(array, index, elem) } - } - @Override - public String toString() { - return Utils.lispStringBuilder(OPERATOR_LABEL) - .body() - .add(array) - .add(index) - .add(elem) - .toString(); - } + fun withIndex(index: Expr): ArrayWriteExpr = with(array, index, elem) + fun withElem(elem: Expr): ArrayWriteExpr = with(array, index, elem) } + From 49884b3be8064efcb277978f92720343527652af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Csan=C3=A1d=20Telbisz?= Date: Fri, 20 Jun 2025 12:01:52 +0200 Subject: [PATCH 07/48] Rename .java to .kt --- .../bme/mit/theta/core/type/booltype/{AndExpr.java => AndExpr.kt} | 0 .../mit/theta/core/type/booltype/{BoolExprs.java => BoolExprs.kt} | 0 .../theta/core/type/booltype/{BoolLitExpr.java => BoolLitExpr.kt} | 0 .../mit/theta/core/type/booltype/{BoolType.java => BoolType.kt} | 0 .../bme/mit/theta/core/type/booltype/{IffExpr.java => IffExpr.kt} | 0 .../mit/theta/core/type/booltype/{ImplyExpr.java => ImplyExpr.kt} | 0 .../bme/mit/theta/core/type/booltype/{NotExpr.java => NotExpr.kt} | 0 .../bme/mit/theta/core/type/booltype/{OrExpr.java => OrExpr.kt} | 0 .../core/type/booltype/{QuantifiedExpr.java => QuantifiedExpr.kt} | 0 .../core/type/booltype/{SmartBoolExprs.java => SmartBoolExprs.kt} | 0 .../bme/mit/theta/core/type/booltype/{XorExpr.java => XorExpr.kt} | 0 11 files changed, 0 insertions(+), 0 deletions(-) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/{AndExpr.java => AndExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/{BoolExprs.java => BoolExprs.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/{BoolLitExpr.java => BoolLitExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/{BoolType.java => BoolType.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/{IffExpr.java => IffExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/{ImplyExpr.java => ImplyExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/{NotExpr.java => NotExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/{OrExpr.java => OrExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/{QuantifiedExpr.java => QuantifiedExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/{SmartBoolExprs.java => SmartBoolExprs.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/{XorExpr.java => XorExpr.kt} (100%) diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/AndExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/AndExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/AndExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/AndExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/BoolExprs.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/BoolExprs.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/BoolExprs.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/BoolExprs.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/BoolLitExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/BoolLitExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/BoolLitExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/BoolLitExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/BoolType.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/BoolType.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/BoolType.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/BoolType.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/IffExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/IffExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/IffExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/IffExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/ImplyExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/ImplyExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/ImplyExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/ImplyExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/NotExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/NotExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/NotExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/NotExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/OrExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/OrExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/OrExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/OrExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/QuantifiedExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/QuantifiedExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/QuantifiedExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/QuantifiedExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/SmartBoolExprs.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/SmartBoolExprs.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/SmartBoolExprs.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/SmartBoolExprs.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/XorExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/XorExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/XorExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/XorExpr.kt From c36379cf2720dbef91ed8f76fcf519b9a42cbae3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Csan=C3=A1d=20Telbisz?= Date: Fri, 20 Jun 2025 12:01:54 +0200 Subject: [PATCH 08/48] convert to serializable - booltype --- .../theta/core/type/abstracttype/Additive.kt | 13 +- .../mit/theta/core/type/booltype/AndExpr.kt | 116 +++-------- .../mit/theta/core/type/booltype/BoolExprs.kt | 154 +++------------ .../theta/core/type/booltype/BoolLitExpr.kt | 58 ++++-- .../mit/theta/core/type/booltype/BoolType.kt | 81 +++----- .../theta/core/type/booltype/ExistsExpr.java | 83 -------- .../theta/core/type/booltype/FalseExpr.java | 64 ------ .../theta/core/type/booltype/ForallExpr.java | 83 -------- .../mit/theta/core/type/booltype/IffExpr.kt | 121 +++--------- .../mit/theta/core/type/booltype/ImplyExpr.kt | 128 +++--------- .../mit/theta/core/type/booltype/NotExpr.kt | 107 +++------- .../mit/theta/core/type/booltype/OrExpr.kt | 117 +++-------- .../core/type/booltype/QuantifiedExpr.kt | 155 +++++++-------- .../core/type/booltype/SmartBoolExprs.kt | 187 ++++-------------- .../theta/core/type/booltype/TrueExpr.java | 63 ------ .../mit/theta/core/type/booltype/XorExpr.kt | 124 +++--------- 16 files changed, 386 insertions(+), 1268 deletions(-) delete mode 100644 subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/ExistsExpr.java delete mode 100644 subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/FalseExpr.java delete mode 100644 subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/ForallExpr.java delete mode 100644 subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/TrueExpr.java diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Additive.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Additive.kt index 6fd8ec3274..f509e8ab12 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Additive.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Additive.kt @@ -21,13 +21,10 @@ import hu.bme.mit.theta.core.type.Type import kotlinx.serialization.Polymorphic @Polymorphic -abstract class Additive> : Type { +interface Additive> : Type { - abstract fun Add(ops: Iterable>): AddExpr - - abstract fun Sub(leftOp: Expr, rightOp: Expr): SubExpr - - abstract fun Pos(op: Expr): PosExpr - - abstract fun Neg(op: Expr): NegExpr + fun Add(ops: Iterable>): AddExpr + fun Sub(leftOp: Expr, rightOp: Expr): SubExpr + fun Pos(op: Expr): PosExpr + fun Neg(op: Expr): NegExpr } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/AndExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/AndExpr.kt index 42b8167b48..315fb3acab 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/AndExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/AndExpr.kt @@ -1,92 +1,40 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. +package hu.bme.mit.theta.core.type.booltype + +import hu.bme.mit.theta.common.Utils +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.MultiaryExpr +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool +import hu.bme.mit.theta.core.type.booltype.BoolExprs.False +import hu.bme.mit.theta.core.type.booltype.BoolExprs.True +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +/** + * Logical AND expression for boolean type. */ -package hu.bme.mit.theta.core.type.booltype; +@Serializable +@SerialName(AndExpr.OPERATOR_LABEL) +data class AndExpr( + override val ops: List> +) : MultiaryExpr() { -import static com.google.common.collect.ImmutableList.toImmutableList; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.False; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.True; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; + companion object { -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.MultiaryExpr; -import java.util.List; - -public final class AndExpr extends MultiaryExpr { - - private static final int HASH_SEED = 41; - private static final String OPERATOR_LABEL = "and"; - - private AndExpr(final Iterable> ops) { - super(ops); + internal const val OPERATOR_LABEL = "and" + fun of(ops: Iterable>) = AndExpr(ops.toList()) + fun create(ops: List>) = AndExpr(ops.map { cast(it, Bool()) }) } - public static AndExpr of(final Iterable> ops) { - return new AndExpr(ops); - } + override val type: BoolType = Bool() + override fun eval(`val`: Valuation): BoolLitExpr = + if (ops.any { !(it.eval(`val`) as BoolLitExpr).value }) False() else True() - public static AndExpr create(final List> ops) { - return AndExpr.of(ops.stream().map(op -> cast(op, Bool())).collect(toImmutableList())); - } - - @Override - public BoolType getType() { - return Bool(); - } - - @Override - public BoolLitExpr eval(final Valuation val) { - for (final Expr op : getOps()) { - final BoolLitExpr opVal = (BoolLitExpr) op.eval(val); - if (!opVal.getValue()) { - return False(); - } - } - return True(); - } + override fun with(ops: Iterable>): AndExpr = + if (ops.toList() == this.ops) this else AndExpr(ops.toList()) - @Override - public AndExpr with(final Iterable> ops) { - if (ops == getOps()) { - return this; - } else { - return AndExpr.of(ops); - } - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final AndExpr that = (AndExpr) obj; - return this.getOps().equals(that.getOps()); - } else { - return false; - } - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } + override fun toString(): String = Utils.lispStringBuilder(OPERATOR_LABEL).add(ops).toString() + override val operatorLabel: String get() = OPERATOR_LABEL } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/BoolExprs.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/BoolExprs.kt index 72ba2f936e..d456f5c220 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/BoolExprs.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/BoolExprs.kt @@ -1,133 +1,27 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.booltype; - -import com.google.common.collect.ImmutableList; -import hu.bme.mit.theta.core.decl.ParamDecl; -import hu.bme.mit.theta.core.type.Expr; - -public final class BoolExprs { - - private BoolExprs() {} - - public static BoolType Bool() { - return BoolType.getInstance(); - } - - public static BoolLitExpr Bool(final boolean value) { - return BoolLitExpr.of(value); - } - - public static TrueExpr True() { - return TrueExpr.getInstance(); - } - - public static FalseExpr False() { - return FalseExpr.getInstance(); - } - - public static NotExpr Not(final Expr op) { - return NotExpr.of(op); - } - - public static ImplyExpr Imply(final Expr leftOp, final Expr rightOp) { - return ImplyExpr.of(leftOp, rightOp); - } - - public static IffExpr Iff(final Expr leftOp, final Expr rightOp) { - return IffExpr.of(leftOp, rightOp); - } - - public static XorExpr Xor(final Expr leftOp, final Expr rightOp) { - return XorExpr.of(leftOp, rightOp); - } - - public static AndExpr And(final Iterable> ops) { - return AndExpr.of(ops); - } +package hu.bme.mit.theta.core.type.booltype - public static OrExpr Or(final Iterable> ops) { - return OrExpr.of(ops); - } +import hu.bme.mit.theta.core.decl.ParamDecl +import hu.bme.mit.theta.core.type.Expr - public static ForallExpr Forall( - final Iterable> paramDecls, final Expr op) { - return ForallExpr.of(paramDecls, op); - } - - public static ExistsExpr Exists( - final Iterable> paramDecls, final Expr op) { - return ExistsExpr.of(paramDecls, op); - } - - /* - * Convenience methods - */ - - public static AndExpr And(final Expr op1, final Expr op2) { - return AndExpr.of(ImmutableList.of(op1, op2)); - } - - public static AndExpr And( - final Expr op1, final Expr op2, final Expr op3) { - return AndExpr.of(ImmutableList.of(op1, op2, op3)); - } - - public static AndExpr And( - final Expr op1, - final Expr op2, - final Expr op3, - final Expr op4) { - return AndExpr.of(ImmutableList.of(op1, op2, op3, op4)); - } - - public static AndExpr And( - final Expr op1, - final Expr op2, - final Expr op3, - final Expr op4, - final Expr op5) { - return AndExpr.of(ImmutableList.of(op1, op2, op3, op4, op5)); - } - - //// - - public static OrExpr Or(final Expr op1, final Expr op2) { - return OrExpr.of(ImmutableList.of(op1, op2)); - } - - public static OrExpr Or( - final Expr op1, final Expr op2, final Expr op3) { - return OrExpr.of(ImmutableList.of(op1, op2, op3)); - } - - public static OrExpr Or( - final Expr op1, - final Expr op2, - final Expr op3, - final Expr op4) { - return OrExpr.of(ImmutableList.of(op1, op2, op3, op4)); - } - - public static OrExpr Or( - final Expr op1, - final Expr op2, - final Expr op3, - final Expr op4, - final Expr op5) { - return OrExpr.of(ImmutableList.of(op1, op2, op3, op4, op5)); - } +/** + * Factory and utility methods for boolean expressions. + */ +@Suppress("FunctionName") +object BoolExprs { + fun Bool() = BoolType + fun Bool(value: Boolean) = BoolLitExpr.of(value) + fun True() = TrueExpr + fun False() = FalseExpr + fun Not(op: Expr) = NotExpr(op) + fun Imply(leftOp: Expr, rightOp: Expr) = ImplyExpr(leftOp, rightOp) + fun Iff(leftOp: Expr, rightOp: Expr) = IffExpr(leftOp, rightOp) + fun Xor(leftOp: Expr, rightOp: Expr) = XorExpr(leftOp, rightOp) + fun And(ops: Iterable>) = AndExpr.of(ops) + fun Or(ops: Iterable>) = OrExpr.of(ops) + fun Forall(paramDecls: Iterable>, op: Expr) = ForallExpr.of(paramDecls, op) + fun Exists(paramDecls: Iterable>, op: Expr) = ExistsExpr.of(paramDecls, op) + // Convenience methods + fun And(vararg ops: Expr) = AndExpr.of(ops.asList()) + fun Or(vararg ops: Expr) = OrExpr.of(ops.asList()) } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/BoolLitExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/BoolLitExpr.kt index 46424d44f7..49fe919202 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/BoolLitExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/BoolLitExpr.kt @@ -1,28 +1,44 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. +package hu.bme.mit.theta.core.type.booltype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.type.NullaryExpr +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +/** + * Abstract base class for boolean literal expressions. */ -package hu.bme.mit.theta.core.type.booltype; +@Serializable +sealed class BoolLitExpr : NullaryExpr(), LitExpr { -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.type.NullaryExpr; + abstract val value: Boolean -public abstract class BoolLitExpr extends NullaryExpr implements LitExpr { + override val type: BoolType = Bool() - public abstract boolean getValue(); + override fun eval(`val`: Valuation): BoolLitExpr = this - public static BoolLitExpr of(final boolean value) { - return value ? TrueExpr.getInstance() : FalseExpr.getInstance(); + companion object { + + fun of(value: Boolean): BoolLitExpr = if (value) TrueExpr else FalseExpr } } + +@Serializable +@SerialName("False") +object FalseExpr : BoolLitExpr() { + + fun getInstance(): FalseExpr = this + override val value: Boolean = false + override fun toString(): String = "false" +} + +@Serializable +@SerialName("True") +object TrueExpr : BoolLitExpr() { + + fun getInstance(): TrueExpr = this + override val value: Boolean = true + override fun toString(): String = "true" +} \ No newline at end of file diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/BoolType.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/BoolType.kt index 92c2a35d12..9b65fcd470 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/BoolType.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/BoolType.kt @@ -1,66 +1,29 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.booltype; - -import hu.bme.mit.theta.core.type.DomainSize; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.Equational; -import hu.bme.mit.theta.core.type.abstracttype.NeqExpr; - -public final class BoolType implements Equational { - - private static final BoolType INSTANCE = new BoolType(); - private static final int HASH_SEED = 754364; - private static final String TYPE_LABEL = "Bool"; - - private BoolType() {} +package hu.bme.mit.theta.core.type.booltype - public static BoolType getInstance() { - return INSTANCE; - } +import hu.bme.mit.theta.core.type.DomainSize +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.Equational +import hu.bme.mit.theta.core.type.abstracttype.NeqExpr +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable - @Override - public int hashCode() { - return HASH_SEED; - } - - @Override - public boolean equals(final Object obj) { - return obj != null && this.getClass() == obj.getClass(); - } - - @Override - public String toString() { - return TYPE_LABEL; - } +/** + * Boolean type for expressions. + */ +@Serializable +@SerialName(BoolType.TYPE_LABEL) +object BoolType : Equational { - //// + internal const val TYPE_LABEL = "Bool" + fun getInstance(): BoolType = this + override fun toString(): String = TYPE_LABEL - @Override - public IffExpr Eq(final Expr leftOp, final Expr rightOp) { - return BoolExprs.Iff(leftOp, rightOp); - } + override fun Eq(leftOp: Expr, rightOp: Expr): IffExpr = + BoolExprs.Iff(leftOp, rightOp) - @Override - public NeqExpr Neq(final Expr leftOp, final Expr rightOp) { - return BoolExprs.Xor(leftOp, rightOp); - } + override fun Neq(leftOp: Expr, rightOp: Expr): NeqExpr = + BoolExprs.Xor(leftOp, rightOp) - @Override - public DomainSize getDomainSize() { - return DomainSize.TWO; - } + override val domainSize: DomainSize = DomainSize.TWO } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/ExistsExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/ExistsExpr.java deleted file mode 100644 index 10ae6b17b9..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/ExistsExpr.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.booltype; - -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import hu.bme.mit.theta.core.decl.ParamDecl; -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.LitExpr; - -public final class ExistsExpr extends QuantifiedExpr { - - private static final int HASH_SEED = 7993; - - private static final String OPERATOR_LABEL = "exists"; - - private ExistsExpr(final Iterable> paramDecls, final Expr op) { - super(paramDecls, op); - } - - public static ExistsExpr of( - final Iterable> paramDecls, final Expr op) { - return new ExistsExpr(paramDecls, op); - } - - public static ExistsExpr create( - final Iterable> paramDecls, final Expr op) { - final Expr newOp = cast(op, Bool()); - return ExistsExpr.of(paramDecls, newOp); - } - - @Override - public LitExpr eval(final Valuation val) { - throw new UnsupportedOperationException(); - } - - @Override - public ExistsExpr with(final Expr op) { - if (op == getOp()) { - return this; - } else { - return ExistsExpr.of(getParamDecls(), op); - } - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final ExistsExpr that = (ExistsExpr) obj; - return this.getParamDecls().equals(that.getParamDecls()) - && this.getOp().equals(that.getOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/FalseExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/FalseExpr.java deleted file mode 100644 index a18a9ac568..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/FalseExpr.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.booltype; - -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.LitExpr; - -public final class FalseExpr extends BoolLitExpr { - - private static final FalseExpr INSTANCE = new FalseExpr(); - private static final int HASH_SEED = 712514; - private static final String OPERATOR_LABEL = "false"; - - private FalseExpr() {} - - public static FalseExpr getInstance() { - return INSTANCE; - } - - @Override - public boolean getValue() { - return false; - } - - @Override - public BoolType getType() { - return Bool(); - } - - @Override - public LitExpr eval(final Valuation val) { - return this; - } - - @Override - public int hashCode() { - return HASH_SEED; - } - - @Override - public boolean equals(final Object obj) { - return (obj != null && this.getClass() == obj.getClass()); - } - - @Override - public String toString() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/ForallExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/ForallExpr.java deleted file mode 100644 index 1afdf61c31..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/ForallExpr.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.booltype; - -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import hu.bme.mit.theta.core.decl.ParamDecl; -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.LitExpr; - -public final class ForallExpr extends QuantifiedExpr { - - private static final int HASH_SEED = 6871; - - private static final String OPERATOR_LABEL = "forall"; - - private ForallExpr(final Iterable> paramDecls, final Expr op) { - super(paramDecls, op); - } - - public static ForallExpr of( - final Iterable> paramDecls, final Expr op) { - return new ForallExpr(paramDecls, op); - } - - public static ForallExpr create( - final Iterable> paramDecls, final Expr op) { - final Expr newOp = cast(op, Bool()); - return ForallExpr.of(paramDecls, newOp); - } - - @Override - public LitExpr eval(final Valuation val) { - throw new UnsupportedOperationException(); - } - - @Override - public ForallExpr with(final Expr op) { - if (op == getOp()) { - return this; - } else { - return ForallExpr.of(getParamDecls(), op); - } - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final ForallExpr that = (ForallExpr) obj; - return this.getParamDecls().equals(that.getParamDecls()) - && this.getOp().equals(that.getOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/IffExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/IffExpr.kt index a53c33dc15..1d141c531a 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/IffExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/IffExpr.kt @@ -1,98 +1,39 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. +package hu.bme.mit.theta.core.type.booltype + +import hu.bme.mit.theta.common.Utils +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool +import hu.bme.mit.theta.core.type.abstracttype.EqExpr +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +/** + * Logical IFF (if and only if) expression for boolean type. */ -package hu.bme.mit.theta.core.type.booltype; +@Serializable +@SerialName(IffExpr.OPERATOR_LABEL) +data class IffExpr( + override val leftOp: Expr, + override val rightOp: Expr +) : EqExpr() { -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; + companion object { -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.EqExpr; - -public final class IffExpr extends EqExpr { - - private static final int HASH_SEED = 67; - - private static final String OPERATOR_LABEL = "iff"; - - private IffExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - } - - public static IffExpr of(final Expr leftOp, final Expr rightOp) { - return new IffExpr(leftOp, rightOp); - } - - public static IffExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = cast(leftOp, Bool()); - final Expr newRightOp = cast(rightOp, Bool()); - return IffExpr.of(newLeftOp, newRightOp); - } - - @Override - public BoolType getType() { - return Bool(); - } - - @Override - public BoolLitExpr eval(final Valuation val) { - final BoolLitExpr leftOpVal = (BoolLitExpr) getLeftOp().eval(val); - final BoolLitExpr rightOpVal = (BoolLitExpr) getRightOp().eval(val); - return Bool(leftOpVal.getValue() == rightOpVal.getValue()); - } - - @Override - public IffExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return new IffExpr(leftOp, rightOp); - } + internal const val OPERATOR_LABEL = "iff" + fun of(leftOp: Expr, rightOp: Expr) = IffExpr(leftOp, rightOp) + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = IffExpr(cast(leftOp, Bool()), cast(rightOp, Bool())) } - @Override - public IffExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } + override val type: BoolType = Bool() + override fun eval(`val`: Valuation): BoolLitExpr = + Bool((leftOp.eval(`val`) as BoolLitExpr).value == (rightOp.eval(`val`) as BoolLitExpr).value) - @Override - public IffExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } + override fun of(leftOp: Expr, rightOp: Expr): IffExpr = + IffExpr(leftOp, rightOp) - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final IffExpr that = (IffExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } + override fun toString(): String = Utils.lispStringBuilder(OPERATOR_LABEL).add(leftOp).add(rightOp).toString() + override val operatorLabel: String get() = OPERATOR_LABEL } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/ImplyExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/ImplyExpr.kt index 2ecc449679..0c7afbb82e 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/ImplyExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/ImplyExpr.kt @@ -1,98 +1,34 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. +package hu.bme.mit.theta.core.type.booltype + +import hu.bme.mit.theta.common.Utils +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool +import hu.bme.mit.theta.core.type.BinaryExpr +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +/** + * Logical implication (=>) expression for boolean type. */ -package hu.bme.mit.theta.core.type.booltype; - -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.BinaryExpr; -import hu.bme.mit.theta.core.type.Expr; - -public final class ImplyExpr extends BinaryExpr { - - private static final int HASH_SEED = 71; - - private static final String OPERATOR_LABEL = "=>"; - - private ImplyExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - } - - public static ImplyExpr of(final Expr leftOp, final Expr rightOp) { - return new ImplyExpr(leftOp, rightOp); - } - - public static ImplyExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = cast(leftOp, Bool()); - final Expr newRightOp = cast(rightOp, Bool()); - return ImplyExpr.of(newLeftOp, newRightOp); - } - - @Override - public BoolType getType() { - return Bool(); - } - - @Override - public BoolLitExpr eval(final Valuation val) { - final BoolLitExpr leftOpVal = (BoolLitExpr) getLeftOp().eval(val); - final BoolLitExpr rightOpVal = (BoolLitExpr) getRightOp().eval(val); - return Bool(!leftOpVal.getValue() || rightOpVal.getValue()); - } - - @Override - public ImplyExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return ImplyExpr.of(leftOp, rightOp); - } - } - - @Override - public ImplyExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } - - @Override - public ImplyExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final ImplyExpr that = (ImplyExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } +@Serializable +@SerialName("Imply") +data class ImplyExpr( + override val leftOp: Expr, + override val rightOp: Expr +) : BinaryExpr() { + companion object { + internal const val OPERATOR_LABEL = "=>" + fun of(leftOp: Expr, rightOp: Expr) = ImplyExpr(leftOp, rightOp) + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = ImplyExpr(cast(leftOp, Bool()), cast(rightOp, Bool())) + } + override val type: BoolType = Bool() + override fun eval(`val`: Valuation): BoolLitExpr = + Bool(!(leftOp.eval(`val`) as BoolLitExpr).value || (rightOp.eval(`val`) as BoolLitExpr).value) + override fun of(leftOp: Expr, rightOp: Expr): ImplyExpr = + ImplyExpr(leftOp, rightOp) + override fun toString(): String = Utils.lispStringBuilder(OPERATOR_LABEL).add(leftOp).add(rightOp).toString() + override val operatorLabel: String get() = OPERATOR_LABEL } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/NotExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/NotExpr.kt index 94ea26cb14..031ea0e036 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/NotExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/NotExpr.kt @@ -1,85 +1,34 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. +package hu.bme.mit.theta.core.type.booltype + +import hu.bme.mit.theta.common.Utils +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.UnaryExpr +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +/** + * Logical NOT expression for boolean type. */ -package hu.bme.mit.theta.core.type.booltype; +@Serializable +@SerialName(NotExpr.OPERATOR_LABEL) +data class NotExpr( + override val op: Expr +) : UnaryExpr() { -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; + companion object { -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.UnaryExpr; - -public final class NotExpr extends UnaryExpr { - - private static final int HASH_SEED = 127; - - private static final String OPERAND_LABEL = "not"; - - private NotExpr(final Expr op) { - super(op); - } - - public static NotExpr of(final Expr op) { - return new NotExpr(op); - } - - public static NotExpr create(final Expr op) { - final Expr newOp = cast(op, Bool()); - return NotExpr.of(newOp); - } - - @Override - public BoolType getType() { - return Bool(); + internal const val OPERATOR_LABEL = "not" + fun of(op: Expr) = NotExpr(op) + fun create(op: Expr<*>) = NotExpr(cast(op, Bool())) } - @Override - public BoolLitExpr eval(final Valuation val) { - final BoolLitExpr opVal = (BoolLitExpr) getOp().eval(val); - return Bool(!opVal.getValue()); - } - - @Override - public NotExpr with(final Expr op) { - if (op == getOp()) { - return this; - } else { - return new NotExpr(op); - } - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final NotExpr that = (NotExpr) obj; - return this.getOp().equals(that.getOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERAND_LABEL; - } + override val type: BoolType = Bool() + override fun eval(`val`: Valuation): BoolLitExpr = Bool(!(op.eval(`val`) as BoolLitExpr).value) + override fun with(op: Expr): NotExpr = if (op == this.op) this else NotExpr(op) + override fun toString(): String = Utils.lispStringBuilder(OPERATOR_LABEL).add(op).toString() + override val operatorLabel: String = OPERATOR_LABEL } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/OrExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/OrExpr.kt index cc51bc2334..d0431a0dda 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/OrExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/OrExpr.kt @@ -1,93 +1,40 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. +package hu.bme.mit.theta.core.type.booltype + +import hu.bme.mit.theta.common.Utils +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.MultiaryExpr +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool +import hu.bme.mit.theta.core.type.booltype.BoolExprs.False +import hu.bme.mit.theta.core.type.booltype.BoolExprs.True +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +/** + * Logical OR expression for boolean type. */ -package hu.bme.mit.theta.core.type.booltype; +@Serializable +@SerialName(OrExpr.OPERATOR_LABEL) +data class OrExpr( + override val ops: List> +) : MultiaryExpr() { -import static com.google.common.collect.ImmutableList.toImmutableList; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.False; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.True; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; + companion object { -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.MultiaryExpr; -import java.util.List; - -public final class OrExpr extends MultiaryExpr { - - private static final int HASH_SEED = 131; - - private static final String OPERATOR_LABEL = "or"; - - private OrExpr(final Iterable> ops) { - super(ops); - } - - public static OrExpr of(final Iterable> ops) { - return new OrExpr(ops); - } - - public static OrExpr create(final List> ops) { - return OrExpr.of(ops.stream().map(op -> cast(op, Bool())).collect(toImmutableList())); - } - - @Override - public BoolType getType() { - return Bool(); + internal const val OPERATOR_LABEL = "or" + fun of(ops: Iterable>) = OrExpr(ops.toList()) + fun create(ops: List>) = OrExpr(ops.map { cast(it, Bool()) }) } - @Override - public BoolLitExpr eval(final Valuation val) { - for (final Expr op : getOps()) { - final BoolLitExpr opVal = (BoolLitExpr) op.eval(val); - if (opVal.getValue()) { - return True(); - } - } - return False(); - } + override val type: BoolType = Bool() + override fun eval(`val`: Valuation): BoolLitExpr = + if (ops.any { (it.eval(`val`) as BoolLitExpr).value }) True() else False() - @Override - public OrExpr with(final Iterable> ops) { - if (ops == getOps()) { - return this; - } else { - return new OrExpr(ops); - } - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final OrExpr that = (OrExpr) obj; - return this.getOps().equals(that.getOps()); - } else { - return false; - } - } + override fun with(ops: Iterable>): OrExpr = + if (ops.toList() == this.ops) this else OrExpr(ops.toList()) - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } + override fun toString(): String = Utils.lispStringBuilder(OPERATOR_LABEL).add(ops).toString() + override val operatorLabel: String get() = OPERATOR_LABEL } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/QuantifiedExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/QuantifiedExpr.kt index 7dec9f0e7a..d142c6b90d 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/QuantifiedExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/QuantifiedExpr.kt @@ -1,106 +1,91 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. +package hu.bme.mit.theta.core.type.booltype + +import hu.bme.mit.theta.common.Utils +import hu.bme.mit.theta.core.decl.ParamDecl +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +/** + * Abstract base class for quantified boolean expressions (forall, exists). */ -package hu.bme.mit.theta.core.type.booltype; +@Serializable +sealed class QuantifiedExpr : Expr { -import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.base.Preconditions.checkNotNull; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static java.util.stream.Collectors.joining; + abstract val paramDecls: List> + abstract val op: Expr -import com.google.common.collect.ImmutableList; -import hu.bme.mit.theta.common.Utils; -import hu.bme.mit.theta.core.decl.ParamDecl; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.Type; -import hu.bme.mit.theta.core.utils.TypeUtils; -import java.util.List; + override val type: BoolType = Bool() + override val ops: List> get() = listOf(op) + override fun withOps(ops: List>): Expr { + require(ops.size == 1) { "QuantifiedExpr expects exactly one operand." } + return with(cast(ops[0], Bool())) + } -public abstract class QuantifiedExpr implements Expr { + override fun eval(`val`: Valuation): LitExpr = throw UnsupportedOperationException() - private final List> paramDecls; + override fun toString(): String { + val paramString = paramDecls.joinToString(" ", prefix = "(", postfix = ")") { "(${it.name} ${it.type})" } + return Utils.lispStringBuilder(operatorLabel).body().add(paramString).add(op).toString() + } - private final Expr op; + abstract fun with(op: Expr): QuantifiedExpr + protected abstract val operatorLabel: String +} - private volatile int hashCode = 0; +/** + * Existential quantifier expression for boolean type. + */ +@Serializable +@SerialName(ExistsExpr.OPERATOR_LABEL) +data class ExistsExpr( + override val paramDecls: List>, + override val op: Expr +) : QuantifiedExpr() { - protected QuantifiedExpr( - final Iterable> paramDecls, final Expr op) { - this.paramDecls = ImmutableList.copyOf(checkNotNull(paramDecls)); - this.op = checkNotNull(op); - } + companion object { - public final List> getParamDecls() { - return paramDecls; - } + internal const val OPERATOR_LABEL = "exists" + fun of(paramDecls: Iterable>, op: Expr) = + ExistsExpr(paramDecls.toList(), op) - public final Expr getOp() { - return op; + fun create(paramDecls: Iterable>, op: Expr<*>) = + ExistsExpr(paramDecls.toList(), cast(op, Bool())) } - @Override - public final BoolType getType() { - return Bool(); - } + override fun with(op: Expr): ExistsExpr = + if (op == this.op) this else ExistsExpr(paramDecls, op) - @Override - public List> getOps() { - return ImmutableList.of(op); - } + override val operatorLabel: String = OPERATOR_LABEL +} - @Override - public Expr withOps(final List> ops) { - checkNotNull(ops); - checkArgument(ops.size() == 1); - final Expr newOp = TypeUtils.cast(ops.get(0), Bool()); - return with(newOp); - } +/** + * Universal quantifier expression for boolean type. + */ +@Serializable +@SerialName(ForallExpr.OPERATOR_LABEL) +data class ForallExpr( + override val paramDecls: List>, + override val op: Expr +) : QuantifiedExpr() { - @Override - public int getArity() { - return 1; - } + companion object { - @Override - public final int hashCode() { - int result = hashCode; - if (result == 0) { - result = getHashSeed(); - result = 31 * result + getParamDecls().hashCode(); - result = 31 * result + getOp().hashCode(); - hashCode = result; - } - return result; - } + internal const val OPERATOR_LABEL = "forall" + fun of(paramDecls: Iterable>, op: Expr) = + ForallExpr(paramDecls.toList(), op) - @Override - public final String toString() { - final String paramString = - paramDecls.stream() - .map(p -> "(" + p.getName() + " " + p.getType() + ")") - .collect(joining(" ", "(", ")")); - return Utils.lispStringBuilder(getOperatorLabel()) - .body() - .add(paramString) - .add(op) - .toString(); + fun create(paramDecls: Iterable>, op: Expr<*>) = + ForallExpr(paramDecls.toList(), cast(op, Bool())) } - public abstract QuantifiedExpr with(final Expr op); - - protected abstract int getHashSeed(); + override fun with(op: Expr): ForallExpr = + if (op == this.op) this else ForallExpr(paramDecls, op) - protected abstract String getOperatorLabel(); + override val operatorLabel: String = OPERATOR_LABEL } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/SmartBoolExprs.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/SmartBoolExprs.kt index 60f63a1481..e09a8dc55b 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/SmartBoolExprs.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/SmartBoolExprs.kt @@ -1,154 +1,51 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.booltype; - -import static com.google.common.collect.ImmutableList.toImmutableList; -import static hu.bme.mit.theta.common.Utils.singleElementOf; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.False; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.True; - -import com.google.common.collect.ImmutableList; -import hu.bme.mit.theta.core.type.Expr; -import java.util.Collection; -import java.util.LinkedHashSet; -import java.util.List; - -public final class SmartBoolExprs { - - private SmartBoolExprs() {} - - public static Expr Not(final Expr op) { - if (op.equals(True())) { - return False(); - } else if (op.equals(False())) { - return True(); - } else if (op instanceof NotExpr) { - return ((NotExpr) op).getOp(); - } else { - return BoolExprs.Not(op); - } - } - - public static Expr Imply(final Expr leftOp, final Expr rightOp) { - if (leftOp.equals(False())) { - return True(); - } else if (leftOp.equals(True())) { - return rightOp; - } else if (rightOp.equals(False())) { - return Not(leftOp); - } else if (rightOp.equals(True())) { - return True(); - } else { - return BoolExprs.Imply(leftOp, rightOp); - } - } +package hu.bme.mit.theta.core.type.booltype - public static Expr And(final Collection> ops) { - if (ops.isEmpty()) { - return True(); - } else if (ops.contains(False())) { - return False(); - } +import hu.bme.mit.theta.core.type.Expr - final List> filteredOps = - ops.stream().filter(o -> !o.equals(True())).collect(toImmutableList()); - - if (filteredOps.isEmpty()) { - return True(); - } else if (filteredOps.size() == 1) { - return singleElementOf(filteredOps); - } else { - return BoolExprs.And(new LinkedHashSet<>(filteredOps)); +/** + * Utility methods for smart construction and simplification of boolean expressions. + */ +@Suppress("FunctionName") +object SmartBoolExprs { + fun Not(op: Expr): Expr = when (op) { + BoolExprs.True() -> BoolExprs.False() + BoolExprs.False() -> BoolExprs.True() + is NotExpr -> op.op + else -> BoolExprs.Not(op) + } + + fun Imply(leftOp: Expr, rightOp: Expr): Expr = when { + leftOp == BoolExprs.False() -> BoolExprs.True() + leftOp == BoolExprs.True() -> rightOp + rightOp == BoolExprs.False() -> Not(leftOp) + rightOp == BoolExprs.True() -> BoolExprs.True() + else -> BoolExprs.Imply(leftOp, rightOp) + } + + fun And(ops: Collection>): Expr { + if (ops.isEmpty()) return BoolExprs.True() + if (BoolExprs.False() in ops) return BoolExprs.False() + val filteredOps = ops.filter { it != BoolExprs.True() } + return when (filteredOps.size) { + 0 -> BoolExprs.True() + 1 -> filteredOps.single() + else -> BoolExprs.And(filteredOps) } } - public static Expr Or(final Collection> ops) { - if (ops.isEmpty()) { - return False(); - } else if (ops.contains(True())) { - return True(); - } - - final List> filteredOps = - ops.stream().filter(o -> !o.equals(False())).collect(toImmutableList()); - - if (filteredOps.isEmpty()) { - return False(); - } else if (filteredOps.size() == 1) { - return singleElementOf(filteredOps); - } else { - return BoolExprs.Or(new LinkedHashSet<>(filteredOps)); + fun Or(ops: Collection>): Expr { + if (ops.isEmpty()) return BoolExprs.False() + if (BoolExprs.True() in ops) return BoolExprs.True() + val filteredOps = ops.filter { it != BoolExprs.False() } + return when (filteredOps.size) { + 0 -> BoolExprs.False() + 1 -> filteredOps.single() + else -> BoolExprs.Or(filteredOps) } } - /* - * Convenience methods - */ - - public static Expr And(final Expr op1, final Expr op2) { - return And(ImmutableList.of(op1, op2)); - } - - public static Expr And( - final Expr op1, final Expr op2, final Expr op3) { - return And(ImmutableList.of(op1, op2, op3)); - } - - public static Expr And( - final Expr op1, - final Expr op2, - final Expr op3, - final Expr op4) { - return And(ImmutableList.of(op1, op2, op3, op4)); - } - - public static Expr And( - final Expr op1, - final Expr op2, - final Expr op3, - final Expr op4, - final Expr op5) { - return And(ImmutableList.of(op1, op2, op3, op4, op5)); - } - - //// - - public static Expr Or(final Expr op1, final Expr op2) { - return Or(ImmutableList.of(op1, op2)); - } - - public static Expr Or( - final Expr op1, final Expr op2, final Expr op3) { - return Or(ImmutableList.of(op1, op2, op3)); - } - - public static Expr Or( - final Expr op1, - final Expr op2, - final Expr op3, - final Expr op4) { - return Or(ImmutableList.of(op1, op2, op3, op4)); - } - - public static Expr Or( - final Expr op1, - final Expr op2, - final Expr op3, - final Expr op4, - final Expr op5) { - return Or(ImmutableList.of(op1, op2, op3, op4, op5)); - } + // Convenience methods + fun And(vararg ops: Expr) = And(ops.toList()) + fun Or(vararg ops: Expr) = Or(ops.toList()) } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/TrueExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/TrueExpr.java deleted file mode 100644 index a411c7bf73..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/TrueExpr.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.booltype; - -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; - -import hu.bme.mit.theta.core.model.Valuation; - -public final class TrueExpr extends BoolLitExpr { - - private static final TrueExpr INSTANCE = new TrueExpr(); - private static final int HASH_SEED = 242181; - private static final String OPERATOR = "true"; - - private TrueExpr() {} - - public static TrueExpr getInstance() { - return INSTANCE; - } - - @Override - public boolean getValue() { - return true; - } - - @Override - public BoolType getType() { - return Bool(); - } - - @Override - public BoolLitExpr eval(final Valuation val) { - return this; - } - - @Override - public int hashCode() { - return HASH_SEED; - } - - @Override - public boolean equals(final Object obj) { - return (obj != null && this.getClass() == obj.getClass()); - } - - @Override - public String toString() { - return OPERATOR; - } -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/XorExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/XorExpr.kt index 940609473f..67cc4c58b8 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/XorExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/XorExpr.kt @@ -1,101 +1,39 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. +package hu.bme.mit.theta.core.type.booltype + +import hu.bme.mit.theta.common.Utils +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.NeqExpr +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +/** + * Logical XOR expression for boolean type. */ -package hu.bme.mit.theta.core.type.booltype; +@Serializable +@SerialName(XorExpr.OPERATOR_LABEL) +data class XorExpr( + override val leftOp: Expr, + override val rightOp: Expr +) : NeqExpr() { -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; + companion object { -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.BinaryExpr; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.type.abstracttype.NeqExpr; - -public final class XorExpr extends NeqExpr { - - private static final int HASH_SEED = 937; - - private static final String OPERATOR_LABEL = "xor"; - - private XorExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - } - - public static XorExpr of(final Expr leftOp, final Expr rightOp) { - return new XorExpr(leftOp, rightOp); - } - - public static XorExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = cast(leftOp, Bool()); - final Expr newRightOp = cast(rightOp, Bool()); - return XorExpr.of(newLeftOp, newRightOp); - } - - @Override - public BoolType getType() { - return Bool(); - } - - @Override - public LitExpr eval(final Valuation val) { - final BoolLitExpr leftOpVal = (BoolLitExpr) getLeftOp().eval(val); - final BoolLitExpr rightOpVal = (BoolLitExpr) getRightOp().eval(val); - return Bool(leftOpVal.getValue() != rightOpVal.getValue()); - } - - @Override - public BinaryExpr with( - final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return XorExpr.of(leftOp, rightOp); - } + internal const val OPERATOR_LABEL = "xor" + fun of(leftOp: Expr, rightOp: Expr) = XorExpr(leftOp, rightOp) + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = XorExpr(cast(leftOp, Bool()), cast(rightOp, Bool())) } - @Override - public BinaryExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } + override val type: BoolType = Bool() + override fun eval(`val`: Valuation): BoolLitExpr = + Bool((leftOp.eval(`val`) as BoolLitExpr).value != (rightOp.eval(`val`) as BoolLitExpr).value) - @Override - public BinaryExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } + override fun of(leftOp: Expr, rightOp: Expr): XorExpr = + XorExpr(leftOp, rightOp) - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final XorExpr that = (XorExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } + override fun toString(): String = Utils.lispStringBuilder(OPERATOR_LABEL).add(leftOp).add(rightOp).toString() + override val operatorLabel: String get() = OPERATOR_LABEL } + From 300c72126df8322a56aafce5b8f6d848cf167890 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Csan=C3=A1d=20Telbisz?= Date: Fri, 20 Jun 2025 12:24:55 +0200 Subject: [PATCH 09/48] Rename .java to .kt --- .../theta/core/type/enumtype/{EnumEqExpr.java => EnumEqExpr.kt} | 0 .../theta/core/type/enumtype/{EnumLitExpr.java => EnumLitExpr.kt} | 0 .../theta/core/type/enumtype/{EnumNeqExpr.java => EnumNeqExpr.kt} | 0 .../mit/theta/core/type/enumtype/{EnumType.java => EnumType.kt} | 0 4 files changed, 0 insertions(+), 0 deletions(-) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/{EnumEqExpr.java => EnumEqExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/{EnumLitExpr.java => EnumLitExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/{EnumNeqExpr.java => EnumNeqExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/{EnumType.java => EnumType.kt} (100%) diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumEqExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumEqExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumEqExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumEqExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumLitExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumLitExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumLitExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumLitExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumNeqExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumNeqExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumNeqExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumNeqExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumType.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumType.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumType.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumType.kt From 1d7d112d00676d81e381351be96708f9a4351507 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Csan=C3=A1d=20Telbisz?= Date: Fri, 20 Jun 2025 12:24:56 +0200 Subject: [PATCH 10/48] convert to serializable - enumtype --- .../theta/core/type/enumtype/EnumEqExpr.kt | 132 ++++-------- .../theta/core/type/enumtype/EnumLitExpr.kt | 104 +++------ .../theta/core/type/enumtype/EnumNeqExpr.kt | 132 ++++-------- .../mit/theta/core/type/enumtype/EnumType.kt | 197 ++++++------------ 4 files changed, 172 insertions(+), 393 deletions(-) diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumEqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumEqExpr.kt index 4125c1e3b9..03af17724c 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumEqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumEqExpr.kt @@ -1,93 +1,41 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.enumtype; - -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.BinaryExpr; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.type.abstracttype.EqExpr; -import hu.bme.mit.theta.core.type.booltype.BoolType; -import java.util.Objects; - -public class EnumEqExpr extends EqExpr { - - private static final int HASH_SEED = 5326; - private static final String OPERATOR_LABEL = "="; - - private EnumEqExpr(Expr leftOp, Expr rightOp) { - super(leftOp, rightOp); - } - - public static EnumEqExpr of(Expr leftOp, Expr rightOp) { - return new EnumEqExpr(leftOp, rightOp); - } - - @Override - public BinaryExpr with(Expr leftOp, Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return EnumEqExpr.of(leftOp, rightOp); - } - } - - @Override - public BinaryExpr withLeftOp(Expr leftOp) { - return with(leftOp, getRightOp()); - } - - @Override - public BinaryExpr withRightOp(Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } - - @Override - public BoolType getType() { - return Bool(); - } - - @Override - public LitExpr eval(Valuation val) { - return EnumLitExpr.eq( - (EnumLitExpr) getLeftOp().eval(val), (EnumLitExpr) getRightOp().eval(val)); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final EnumEqExpr that = (EnumEqExpr) obj; - return Objects.equals(this.getLeftOp(), that.getLeftOp()) - && Objects.equals(this.getRightOp(), that.getRightOp()); - } else { - return false; - } - } +package hu.bme.mit.theta.core.type.enumtype + +import hu.bme.mit.theta.common.Utils +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.BinaryExpr +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.type.abstracttype.EqExpr +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool +import hu.bme.mit.theta.core.type.booltype.BoolType +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("EnumEqExpr") +data class EnumEqExpr( + override val leftOp: Expr, + override val rightOp: Expr +) : EqExpr() { + + companion object { + + private const val OPERATOR_LABEL = "=" + fun of(leftOp: Expr, rightOp: Expr) = EnumEqExpr(leftOp, rightOp) + } + + override val operatorLabel: String = OPERATOR_LABEL + override val type: BoolType = Bool() + override fun eval(`val`: Valuation): LitExpr = + EnumLitExpr.eq(leftOp.eval(`val`) as EnumLitExpr, rightOp.eval(`val`) as EnumLitExpr) + + override fun of(leftOp: Expr, rightOp: Expr): BinaryExpr = + of(leftOp, rightOp) + + override fun toString(): String = Utils.lispStringBuilder(OPERATOR_LABEL) + .body() + .add(leftOp) + .add(rightOp) + .toString() } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumLitExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumLitExpr.kt index 906654db17..8709111cd6 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumLitExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumLitExpr.kt @@ -1,86 +1,36 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.enumtype; +package hu.bme.mit.theta.core.type.enumtype -import static com.google.common.base.Preconditions.checkArgument; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.type.NullaryExpr +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool +import hu.bme.mit.theta.core.type.booltype.BoolLitExpr +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -import com.google.common.base.Objects; -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.type.NullaryExpr; -import hu.bme.mit.theta.core.type.booltype.BoolLitExpr; +@Serializable +@SerialName("EnumLitExpr") +data class EnumLitExpr( + override val type: EnumType, + val value: String +) : NullaryExpr(), LitExpr { -public final class EnumLitExpr extends NullaryExpr implements LitExpr { + companion object { - private final EnumType type; - private final String value; + fun of(type: EnumType, literalName: String): EnumLitExpr { + val value = EnumType.getShortName(literalName) + require(value in type.values) { "Invalid value $value for type ${type.name}" } + return EnumLitExpr(type, value) + } - private EnumLitExpr(EnumType type, String value) { - this.type = type; - this.value = value; - } - - public static EnumLitExpr of(EnumType type, String literalName) { - String value = EnumType.getShortName(literalName); - checkArgument( - type.getValues().contains(value), - "Invalid value %s for type %s", - value, - type.getName()); - return new EnumLitExpr(type, value); - } - - public static BoolLitExpr eq(EnumLitExpr l, EnumLitExpr r) { - return Bool(l.type.equals(r.type) && l.value.equals(r.value)); - } - - public static BoolLitExpr neq(EnumLitExpr l, EnumLitExpr r) { - return Bool(!l.type.equals(r.type) || !l.value.equals(r.value)); - } - - @Override - public EnumType getType() { - return type; - } + fun eq(l: EnumLitExpr, r: EnumLitExpr): BoolLitExpr = + Bool(l.type == r.type && l.value == r.value) - public String getValue() { - return value; + fun neq(l: EnumLitExpr, r: EnumLitExpr): BoolLitExpr = + Bool(l.type != r.type || l.value != r.value) } - @Override - public LitExpr eval(Valuation val) { - return this; - } - - @Override - public String toString() { - return EnumType.makeLongName(type.getName(), value); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - EnumLitExpr that = (EnumLitExpr) o; - return Objects.equal(type, that.type) && Objects.equal(value, that.value); - } - - @Override - public int hashCode() { - return Objects.hashCode(type, value); - } + override fun eval(`val`: Valuation): LitExpr = this + override fun toString(): String = EnumType.makeLongName(type, value) } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumNeqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumNeqExpr.kt index 00761b2b89..c3a2bb3a1c 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumNeqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumNeqExpr.kt @@ -1,93 +1,41 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.enumtype; - -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.BinaryExpr; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.type.abstracttype.NeqExpr; -import hu.bme.mit.theta.core.type.booltype.BoolType; -import java.util.Objects; - -public final class EnumNeqExpr extends NeqExpr { - - private static final int HASH_SEED = 7212; - private static final String OPERATOR_LABEL = "!="; - - private EnumNeqExpr(Expr leftOp, Expr rightOp) { - super(leftOp, rightOp); - } - - public static EnumNeqExpr of(Expr leftOp, Expr rightOp) { - return new EnumNeqExpr(leftOp, rightOp); - } - - @Override - public BinaryExpr with(Expr leftOp, Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return EnumNeqExpr.of(leftOp, rightOp); - } - } - - @Override - public BinaryExpr withLeftOp(Expr leftOp) { - return with(leftOp, getRightOp()); - } - - @Override - public BinaryExpr withRightOp(Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } - - @Override - public BoolType getType() { - return Bool(); - } - - @Override - public LitExpr eval(Valuation val) { - return EnumLitExpr.neq( - (EnumLitExpr) getLeftOp().eval(val), (EnumLitExpr) getRightOp().eval(val)); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final EnumNeqExpr that = (EnumNeqExpr) obj; - return Objects.equals(this.getLeftOp(), that.getLeftOp()) - && Objects.equals(this.getRightOp(), that.getRightOp()); - } else { - return false; - } - } +package hu.bme.mit.theta.core.type.enumtype + +import hu.bme.mit.theta.common.Utils +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.BinaryExpr +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.type.abstracttype.NeqExpr +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool +import hu.bme.mit.theta.core.type.booltype.BoolType +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("EnumNeqExpr") +data class EnumNeqExpr( + override val leftOp: Expr, + override val rightOp: Expr +) : NeqExpr() { + + companion object { + + private const val OPERATOR_LABEL = "!=" + fun of(leftOp: Expr, rightOp: Expr) = EnumNeqExpr(leftOp, rightOp) + } + + override val operatorLabel: String = OPERATOR_LABEL + override val type: BoolType = Bool() + override fun eval(`val`: Valuation): LitExpr = + EnumLitExpr.neq(leftOp.eval(`val`) as EnumLitExpr, rightOp.eval(`val`) as EnumLitExpr) + + override fun of(leftOp: Expr, rightOp: Expr): BinaryExpr = + of(leftOp, rightOp) + + override fun toString(): String = Utils.lispStringBuilder(OPERATOR_LABEL) + .body() + .add(leftOp) + .add(rightOp) + .toString() } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumType.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumType.kt index 58a1c30b79..6bc2678327 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumType.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumType.kt @@ -1,139 +1,72 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.enumtype; - -import static com.google.common.base.Preconditions.checkArgument; - -import hu.bme.mit.theta.core.type.DomainSize; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.type.Type; -import hu.bme.mit.theta.core.type.abstracttype.EqExpr; -import hu.bme.mit.theta.core.type.abstracttype.Equational; -import hu.bme.mit.theta.core.type.abstracttype.NeqExpr; -import hu.bme.mit.theta.core.type.anytype.InvalidLitExpr; -import java.util.Collection; -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.Set; -import java.util.regex.Pattern; -import java.util.stream.Collectors; - -public final class EnumType implements Equational, Type { - - public static final String FULLY_QUALIFIED_NAME_SEPARATOR = "."; - private final Map literals; - private final String name; - private int counter = 0; - - private EnumType(String name, Collection values) { - this.name = name; - this.literals = new LinkedHashMap<>(); - values.forEach(value -> literals.put(value, counter++)); - } - - public static EnumType of(String name, Collection values) { - return new EnumType(name, values); - } - - public static String makeLongName(String typeName, String literal) { - return String.format("%s%s%s", typeName, FULLY_QUALIFIED_NAME_SEPARATOR, literal); - } - - public static String makeLongName(EnumType type, String literal) { - return makeLongName(type.getName(), literal); - } - - public static String getShortName(String longName) { - if (!longName.contains(FULLY_QUALIFIED_NAME_SEPARATOR)) return longName; - return longName.substring( - longName.indexOf(FULLY_QUALIFIED_NAME_SEPARATOR) - + FULLY_QUALIFIED_NAME_SEPARATOR.length()); - } - - @Override - public DomainSize getDomainSize() { - return DomainSize.of(literals.size()); - } - - @Override - public EqExpr Eq(Expr leftOp, Expr rightOp) { - return EnumEqExpr.of(leftOp, rightOp); - } - - @Override - public NeqExpr Neq(Expr leftOp, Expr rightOp) { - return EnumNeqExpr.of(leftOp, rightOp); - } - - public Set getValues() { - return literals.keySet(); - } - - public Set getLongValues() { - return literals.keySet().stream() - .map(val -> makeLongName(this, val)) - .collect(Collectors.toSet()); - } - - public String getName() { - return name; - } - - public int getIntValue(EnumLitExpr literal) { - return getIntValue(literal.getValue()); - } - - public int getIntValue(String literal) { - checkArgument( - literals.containsKey(literal), - String.format("Enum type %s does not contain literal '%s'", name, literal)); - return literals.get(literal); - } - - public LitExpr litFromShortName(String shortName) { +package hu.bme.mit.theta.core.type.enumtype + +import hu.bme.mit.theta.core.type.DomainSize +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.type.Type +import hu.bme.mit.theta.core.type.abstracttype.EqExpr +import hu.bme.mit.theta.core.type.abstracttype.Equational +import hu.bme.mit.theta.core.type.abstracttype.NeqExpr +import hu.bme.mit.theta.core.type.anytype.InvalidLitExpr +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName(EnumType.TYPE_LABEL) +data class EnumType( + val name: String, + private val literals: Map, +) : Equational, Type { + + companion object { + + internal const val TYPE_LABEL = "Enum" + const val FULLY_QUALIFIED_NAME_SEPARATOR = "." + fun of(name: String, values: Collection) = + EnumType(name, values.withIndex().associate { it.value to it.index }.toMap(LinkedHashMap())) + + fun makeLongName(typeName: String, literal: String) = "$typeName$FULLY_QUALIFIED_NAME_SEPARATOR$literal" + fun makeLongName(type: EnumType, literal: String) = makeLongName(type.name, literal) + fun getShortName(longName: String): String = + if (FULLY_QUALIFIED_NAME_SEPARATOR !in longName) longName + else longName.substring( + longName.indexOf(FULLY_QUALIFIED_NAME_SEPARATOR) + FULLY_QUALIFIED_NAME_SEPARATOR.length + ) + } + + override val domainSize: DomainSize get() = DomainSize.of(literals.size.toLong()) + + override fun Eq(leftOp: Expr, rightOp: Expr): EqExpr = EnumEqExpr.of(leftOp, rightOp) + override fun Neq(leftOp: Expr, rightOp: Expr): NeqExpr = + EnumNeqExpr.of(leftOp, rightOp) + + val values: Set get() = literals.keys + val longValues: Set get() = literals.keys.map { makeLongName(this, it) }.toSet() + + fun getIntValue(literal: EnumLitExpr): Int = getIntValue(literal.value) + fun getIntValue(literal: String): Int = literals[literal] + ?: throw IllegalArgumentException("Enum type $name does not contain literal '$literal'") + + fun litFromShortName(shortName: String): LitExpr = try { - return EnumLitExpr.of(this, shortName); - } catch (Exception e) { - throw new RuntimeException( - String.format("%s is not valid for type %s", shortName, name), e); + EnumLitExpr.of(this, shortName) + } catch (e: Exception) { + throw RuntimeException("$shortName is not valid for type $name", e) } - } - public LitExpr litFromLongName(String longName) { - if (!longName.contains(FULLY_QUALIFIED_NAME_SEPARATOR)) - throw new RuntimeException(String.format("%s is an invalid enum longname")); - String[] parts = longName.split(Pattern.quote(FULLY_QUALIFIED_NAME_SEPARATOR)); - String type = parts[0]; - checkArgument( - name.equals(type), String.format("%s does not belong to type %s", type, name)); - return litFromShortName(parts[1]); + fun litFromLongName(longName: String): LitExpr { + if (FULLY_QUALIFIED_NAME_SEPARATOR !in longName) + throw RuntimeException("$longName is an invalid enum longname") + val parts = longName.split(FULLY_QUALIFIED_NAME_SEPARATOR) + val type = parts[0] + require(name == type) { "$type does not belong to type $name" } + return litFromShortName(parts[1]) } - public LitExpr litFromIntValue(int value) { - for (Map.Entry entry : literals.entrySet()) { - if (entry.getValue() == value) { - return EnumLitExpr.of(this, entry.getKey()); - } - } - return new InvalidLitExpr<>(this); - } + fun litFromIntValue(value: Int): LitExpr = + literals.entries.find { it.value == value }?.let { EnumLitExpr.of(this, it.key) } + ?: InvalidLitExpr(this) - @Override - public String toString() { - return String.format("EnumType{%s}", name); - } + override fun toString(): String = "EnumType{$name}" } + From 31cfb0f66699d3835d086128f78a9901d05cc103 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Csan=C3=A1d=20Telbisz?= Date: Fri, 20 Jun 2025 13:10:54 +0200 Subject: [PATCH 11/48] Rename .java to .kt --- .../theta/core/type/functype/{FuncAppExpr.java => FuncAppExpr.kt} | 0 .../theta/core/type/functype/{FuncLitExpr.java => FuncLitExpr.kt} | 0 .../mit/theta/core/type/functype/{FuncType.java => FuncType.kt} | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/functype/{FuncAppExpr.java => FuncAppExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/functype/{FuncLitExpr.java => FuncLitExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/functype/{FuncType.java => FuncType.kt} (100%) diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/functype/FuncAppExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/functype/FuncAppExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/functype/FuncAppExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/functype/FuncAppExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/functype/FuncLitExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/functype/FuncLitExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/functype/FuncLitExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/functype/FuncLitExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/functype/FuncType.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/functype/FuncType.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/functype/FuncType.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/functype/FuncType.kt From 6a2a251893cc1dc8c83cf421a0b36412ab003a09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Csan=C3=A1d=20Telbisz?= Date: Fri, 20 Jun 2025 13:10:55 +0200 Subject: [PATCH 12/48] convert to serializable - functype --- .../theta/core/type/functype/FuncAppExpr.kt | 187 ++++++------------ .../theta/core/type/functype/FuncLitExpr.kt | 157 ++++----------- .../mit/theta/core/type/functype/FuncType.kt | 102 +++------- 3 files changed, 115 insertions(+), 331 deletions(-) diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/functype/FuncAppExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/functype/FuncAppExpr.kt index 516cbabcd4..0a96e2e41d 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/functype/FuncAppExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/functype/FuncAppExpr.kt @@ -1,141 +1,66 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. +package hu.bme.mit.theta.core.type.functype + +import hu.bme.mit.theta.common.Utils +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.type.Type +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +/** + * Function application expression for function types. */ -package hu.bme.mit.theta.core.type.functype; - -import static com.google.common.base.Preconditions.checkNotNull; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import com.google.common.collect.ImmutableList; -import hu.bme.mit.theta.common.Utils; -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.type.Type; -import java.util.List; - -public final class FuncAppExpr - implements Expr { - - private static final int HASH_SEED = 7951; - - private final Expr> func; - private final Expr param; - - private volatile int hashCode = 0; - - private FuncAppExpr( - final Expr> func, final Expr param) { - this.func = checkNotNull(func); - this.param = checkNotNull(param); - } - - public static - FuncAppExpr of( - final Expr> func, final Expr param) { - return new FuncAppExpr<>(func, param); - } - - public static FuncAppExpr create( - final Expr func, final Expr param) { - @SuppressWarnings("unchecked") - final FuncType funcType = - (FuncType) func.getType(); - final Expr> newFunc = cast(func, funcType); - final Expr newParam = cast(param, funcType.getParamType()); - return FuncAppExpr.of(newFunc, newParam); - } - - public Expr> getFunc() { - return func; - } - - public Expr getParam() { - return param; - } - - @Override - public ResultType getType() { - return getFunc().getType().getResultType(); - } - - @Override - public LitExpr eval(final Valuation val) { - // TODO Auto-generated method stub - throw new UnsupportedOperationException("TODO: auto-generated method stub"); - } - - @Override - public int getArity() { - return 2; - } - - @Override - public List> getOps() { - return ImmutableList.of(func, param); - } - - @Override - public Expr withOps(final List> ops) { - return cast(create(ops.get(0), ops.get(1)), getType()); - } - - public FuncAppExpr with( - final Expr> func, final Expr param) { - if (this.func == func && this.param == param) { - return this; - } else { - return FuncAppExpr.of(func, param); +@Serializable +@SerialName("FuncAppExpr") +data class FuncAppExpr( + val func: Expr>, + val param: Expr +) : Expr { + + companion object { + + @JvmStatic + fun of( + func: Expr>, + param: Expr + ) = FuncAppExpr(func, param) + + @Suppress("UNCHECKED_CAST") + @JvmStatic + fun create( + func: Expr<*>, + param: Expr<*> + ): FuncAppExpr { + val funcType = func.type as FuncType + val newFunc = cast(func, funcType) + val newParam = cast(param, funcType.paramType) + return of(newFunc, newParam) } } - public FuncAppExpr withFunc( - final Expr> func) { - return with(func, getParam()); + override val type: ResultType = func.type.resultType + override fun eval(`val`: Valuation): LitExpr = throw UnsupportedOperationException() + override val ops: List> = listOf(func, param) + override fun withOps(ops: List>): Expr { + require(ops.size == 2) + return cast(create(ops[0], ops[1]), type) } - public FuncAppExpr withParam(final Expr param) { - return with(getFunc(), param); - } + fun with( + func: Expr>, + param: Expr + ): FuncAppExpr = + if (this.func == func && this.param == param) this else of(func, param) - @Override - public int hashCode() { - int result = hashCode; - if (result == 0) { - result = HASH_SEED; - result = 31 * result + func.hashCode(); - result = 31 * result + param.hashCode(); - hashCode = result; - } - return result; - } + fun withFunc(func: Expr>): FuncAppExpr = + with(func, param) - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final FuncAppExpr that = (FuncAppExpr) obj; - return this.getFunc().equals(that.getFunc()) && this.getParam().equals(that.getParam()); - } else { - return false; - } - } + fun withParam(param: Expr): FuncAppExpr = + with(func, param) - @Override - public String toString() { - return Utils.lispStringBuilder().add(func).body().add(param).toString(); - } + override fun toString(): String = + Utils.lispStringBuilder().add(func).body().add(param).toString() } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/functype/FuncLitExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/functype/FuncLitExpr.kt index 3aaab9f791..fda0b66aa7 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/functype/FuncLitExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/functype/FuncLitExpr.kt @@ -1,132 +1,47 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. +package hu.bme.mit.theta.core.type.functype + +import hu.bme.mit.theta.common.Utils +import hu.bme.mit.theta.core.decl.ParamDecl +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.type.Type +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +/** + * Function literal expression (lambda abstraction) for function types. */ -package hu.bme.mit.theta.core.type.functype; +@Serializable +@SerialName("FuncLitExpr") +data class FuncLitExpr( + val param: ParamDecl, + val result: Expr +) : LitExpr> { -import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.base.Preconditions.checkNotNull; -import static hu.bme.mit.theta.core.type.functype.FuncExprs.Func; + companion object { -import com.google.common.collect.ImmutableList; -import hu.bme.mit.theta.common.Utils; -import hu.bme.mit.theta.core.decl.ParamDecl; -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.type.Type; -import hu.bme.mit.theta.core.utils.TypeUtils; -import java.util.List; + private const val OPERATOR_LABEL = "func" -public final class FuncLitExpr - implements LitExpr> { - - private static final int HASH_SEED = 53; - private static final String OPERATOR_LABEL = "func"; - - private final ParamDecl param; - private final Expr result; - - private volatile int hashCode = 0; - - private FuncLitExpr(final ParamDecl param, final Expr result) { - this.param = checkNotNull(param); - this.result = checkNotNull(result); - } - - public static - FuncLitExpr of( - final ParamDecl param, final Expr result) { - return new FuncLitExpr<>(param, result); - } - - public ParamDecl getParam() { - return param; - } - - public Expr getResult() { - return result; - } - - @Override - public FuncType getType() { - return Func(param.getType(), result.getType()); + @JvmStatic + fun of(param: ParamDecl, result: Expr) = + FuncLitExpr(param, result) } - @Override - public LitExpr> eval(final Valuation val) { - return this; + override val type: FuncType = FuncType.of(param.type, result.type) + override fun eval(`val`: Valuation): LitExpr> = this + override val ops: List> = listOf(result) + override fun withOps(ops: List>): FuncLitExpr { + require(ops.size == 1) + return with(cast(ops[0], result.type)) } - @Override - public int getArity() { - return 1; - } - - @Override - public List> getOps() { - return ImmutableList.of(result); - } - - @Override - public Expr> withOps(final List> ops) { - checkNotNull(ops); - checkArgument(ops.size() == 1); - final Expr newResult = TypeUtils.cast(ops.get(0), result.getType()); - return with(newResult); - } - - public FuncLitExpr with(final Expr result) { - if (this.result == result) { - return this; - } else { - return FuncLitExpr.of(param, result); - } - } - - @Override - public int hashCode() { - int tmp = hashCode; - if (tmp == 0) { - tmp = HASH_SEED; - tmp = 31 * tmp + param.hashCode(); - tmp = 31 * tmp + result.hashCode(); - hashCode = tmp; - } - return tmp; - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final FuncLitExpr that = (FuncLitExpr) obj; - return this.getParam().equals(that.getParam()) - && this.getResult().equals(that.getResult()); - } else { - return false; - } - } + fun with(result: Expr): FuncLitExpr = + if (this.result == result) this else of(param, result) - @Override - public String toString() { - final String paramString = String.format("(%s %s)", param.getName(), param.getType()); - return Utils.lispStringBuilder(OPERATOR_LABEL) - .body() - .add(paramString) - .add(result) - .toString(); + override fun toString(): String { + val paramString = "(${param.name} ${param.type})" + return Utils.lispStringBuilder(OPERATOR_LABEL).body().add(paramString).add(result).toString() } } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/functype/FuncType.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/functype/FuncType.kt index 0f61b026cc..9d50404593 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/functype/FuncType.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/functype/FuncType.kt @@ -1,87 +1,31 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.functype; - -import static com.google.common.base.Preconditions.checkNotNull; - -import hu.bme.mit.theta.common.Utils; -import hu.bme.mit.theta.core.type.DomainSize; -import hu.bme.mit.theta.core.type.Type; - -public final class FuncType implements Type { - - private static final int HASH_SEED = 3931; - private static final String TYPE_LABEL = "Func"; - - private final ParamType paramType; - private final ResultType resultType; - - private volatile int hashCode = 0; - - private FuncType(final ParamType paramType, final ResultType resultType) { - this.paramType = checkNotNull(paramType); - this.resultType = checkNotNull(resultType); - } +package hu.bme.mit.theta.core.type.functype - public static - FuncType of( - final ParamType paramType, final ResultType resultType) { - return new FuncType<>(paramType, resultType); - } +import hu.bme.mit.theta.common.Utils +import hu.bme.mit.theta.core.type.DomainSize +import hu.bme.mit.theta.core.type.Type +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable - public ParamType getParamType() { - return paramType; - } +/** + * Represents a function type from ParamType to ResultType. + */ +@Serializable +@SerialName(FuncType.TYPE_LABEL) +data class FuncType( + val paramType: ParamType, + val resultType: ResultType +) : Type { - public ResultType getResultType() { - return resultType; - } + companion object { - @Override - public int hashCode() { - int result = hashCode; - if (result == 0) { - result = HASH_SEED; - result = 31 * result + paramType.hashCode(); - result = 31 * result + resultType.hashCode(); - hashCode = result; - } - return result; - } + internal const val TYPE_LABEL = "Func" - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final FuncType that = (FuncType) obj; - return this.getParamType().equals(that.getParamType()) - && this.getResultType().equals(that.getResultType()); - } else { - return false; - } + @JvmStatic + fun of(paramType: ParamType, resultType: ResultType) = + FuncType(paramType, resultType) } - @Override - public String toString() { - return Utils.lispStringBuilder(TYPE_LABEL).add(paramType).add(resultType).toString(); - } - - @Override - public DomainSize getDomainSize() { - throw new UnsupportedOperationException(); - } + override fun toString(): String = Utils.lispStringBuilder(TYPE_LABEL).add(paramType).add(resultType).toString() + override val domainSize: DomainSize get() = throw UnsupportedOperationException() } + From 6f672db841d4eb309d13faf89125a5dd34b76d5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Csan=C3=A1d=20Telbisz?= Date: Fri, 20 Jun 2025 13:13:45 +0200 Subject: [PATCH 13/48] convert to serializable - some @JvmStatic annotations --- .../java/hu/bme/mit/theta/core/type/enumtype/EnumEqExpr.kt | 2 +- .../java/hu/bme/mit/theta/core/type/enumtype/EnumLitExpr.kt | 4 +++- .../java/hu/bme/mit/theta/core/type/enumtype/EnumNeqExpr.kt | 2 +- .../java/hu/bme/mit/theta/core/type/enumtype/EnumType.kt | 5 ++++- 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumEqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumEqExpr.kt index 03af17724c..b25fc8146d 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumEqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumEqExpr.kt @@ -21,6 +21,7 @@ data class EnumEqExpr( companion object { private const val OPERATOR_LABEL = "=" + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = EnumEqExpr(leftOp, rightOp) } @@ -38,4 +39,3 @@ data class EnumEqExpr( .add(rightOp) .toString() } - diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumLitExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumLitExpr.kt index 8709111cd6..64a2690194 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumLitExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumLitExpr.kt @@ -17,15 +17,18 @@ data class EnumLitExpr( companion object { + @JvmStatic fun of(type: EnumType, literalName: String): EnumLitExpr { val value = EnumType.getShortName(literalName) require(value in type.values) { "Invalid value $value for type ${type.name}" } return EnumLitExpr(type, value) } + @JvmStatic fun eq(l: EnumLitExpr, r: EnumLitExpr): BoolLitExpr = Bool(l.type == r.type && l.value == r.value) + @JvmStatic fun neq(l: EnumLitExpr, r: EnumLitExpr): BoolLitExpr = Bool(l.type != r.type || l.value != r.value) } @@ -33,4 +36,3 @@ data class EnumLitExpr( override fun eval(`val`: Valuation): LitExpr = this override fun toString(): String = EnumType.makeLongName(type, value) } - diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumNeqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumNeqExpr.kt index c3a2bb3a1c..a4e30cdcb8 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumNeqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumNeqExpr.kt @@ -21,6 +21,7 @@ data class EnumNeqExpr( companion object { private const val OPERATOR_LABEL = "!=" + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = EnumNeqExpr(leftOp, rightOp) } @@ -38,4 +39,3 @@ data class EnumNeqExpr( .add(rightOp) .toString() } - diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumType.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumType.kt index 6bc2678327..c43c0b78e8 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumType.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumType.kt @@ -22,11 +22,15 @@ data class EnumType( internal const val TYPE_LABEL = "Enum" const val FULLY_QUALIFIED_NAME_SEPARATOR = "." + @JvmStatic fun of(name: String, values: Collection) = EnumType(name, values.withIndex().associate { it.value to it.index }.toMap(LinkedHashMap())) + @JvmStatic fun makeLongName(typeName: String, literal: String) = "$typeName$FULLY_QUALIFIED_NAME_SEPARATOR$literal" + @JvmStatic fun makeLongName(type: EnumType, literal: String) = makeLongName(type.name, literal) + @JvmStatic fun getShortName(longName: String): String = if (FULLY_QUALIFIED_NAME_SEPARATOR !in longName) longName else longName.substring( @@ -69,4 +73,3 @@ data class EnumType( override fun toString(): String = "EnumType{$name}" } - From 2178e058cf0f7d35de55596dc8559f4339f0c586 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Csan=C3=A1d=20Telbisz?= Date: Fri, 20 Jun 2025 15:15:28 +0200 Subject: [PATCH 14/48] Rename .java to .kt --- .../theta/core/type/inttype/{IntAddExpr.java => IntAddExpr.kt} | 0 .../theta/core/type/inttype/{IntDivExpr.java => IntDivExpr.kt} | 0 .../mit/theta/core/type/inttype/{IntEqExpr.java => IntEqExpr.kt} | 0 .../mit/theta/core/type/inttype/{IntExprs.java => IntExprs.kt} | 0 .../theta/core/type/inttype/{IntGeqExpr.java => IntGeqExpr.kt} | 0 .../mit/theta/core/type/inttype/{IntGtExpr.java => IntGtExpr.kt} | 0 .../theta/core/type/inttype/{IntLeqExpr.java => IntLeqExpr.kt} | 0 .../theta/core/type/inttype/{IntLitExpr.java => IntLitExpr.kt} | 0 .../mit/theta/core/type/inttype/{IntLtExpr.java => IntLtExpr.kt} | 0 .../theta/core/type/inttype/{IntModExpr.java => IntModExpr.kt} | 0 .../theta/core/type/inttype/{IntMulExpr.java => IntMulExpr.kt} | 0 .../theta/core/type/inttype/{IntNegExpr.java => IntNegExpr.kt} | 0 .../theta/core/type/inttype/{IntNeqExpr.java => IntNeqExpr.kt} | 0 .../theta/core/type/inttype/{IntPosExpr.java => IntPosExpr.kt} | 0 .../theta/core/type/inttype/{IntRemExpr.java => IntRemExpr.kt} | 0 .../theta/core/type/inttype/{IntSubExpr.java => IntSubExpr.kt} | 0 .../core/type/inttype/{IntToRatExpr.java => IntToRatExpr.kt} | 0 .../bme/mit/theta/core/type/inttype/{IntType.java => IntType.kt} | 0 18 files changed, 0 insertions(+), 0 deletions(-) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/{IntAddExpr.java => IntAddExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/{IntDivExpr.java => IntDivExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/{IntEqExpr.java => IntEqExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/{IntExprs.java => IntExprs.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/{IntGeqExpr.java => IntGeqExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/{IntGtExpr.java => IntGtExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/{IntLeqExpr.java => IntLeqExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/{IntLitExpr.java => IntLitExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/{IntLtExpr.java => IntLtExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/{IntModExpr.java => IntModExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/{IntMulExpr.java => IntMulExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/{IntNegExpr.java => IntNegExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/{IntNeqExpr.java => IntNeqExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/{IntPosExpr.java => IntPosExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/{IntRemExpr.java => IntRemExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/{IntSubExpr.java => IntSubExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/{IntToRatExpr.java => IntToRatExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/{IntType.java => IntType.kt} (100%) diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntAddExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntAddExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntAddExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntAddExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntDivExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntDivExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntDivExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntDivExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntEqExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntEqExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntEqExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntEqExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntExprs.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntExprs.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntExprs.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntExprs.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntGeqExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntGeqExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntGeqExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntGeqExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntGtExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntGtExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntGtExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntGtExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLeqExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLeqExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLeqExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLeqExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLitExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLitExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLitExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLitExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLtExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLtExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLtExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLtExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntModExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntModExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntModExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntModExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntMulExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntMulExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntMulExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntMulExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntNegExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntNegExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntNegExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntNegExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntNeqExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntNeqExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntNeqExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntNeqExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntPosExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntPosExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntPosExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntPosExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntRemExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntRemExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntRemExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntRemExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntSubExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntSubExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntSubExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntSubExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntToRatExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntToRatExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntToRatExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntToRatExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntType.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntType.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntType.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntType.kt From 0d18f70f587183b4318b5d370a10a5bdcfca1535 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Csan=C3=A1d=20Telbisz?= Date: Fri, 20 Jun 2025 15:15:30 +0200 Subject: [PATCH 15/48] convert to serializable - inttype --- .../hu/bme/mit/theta/core/type/BinaryExpr.kt | 2 +- .../bme/mit/theta/core/type/MultiaryExpr.kt | 9 +- .../hu/bme/mit/theta/core/type/UnaryExpr.kt | 5 +- .../mit/theta/core/type/anytype/PrimeExpr.kt | 2 +- .../theta/core/type/arraytype/ArrayEqExpr.kt | 4 +- .../theta/core/type/arraytype/ArrayNeqExpr.kt | 4 +- .../mit/theta/core/type/booltype/AndExpr.kt | 4 +- .../mit/theta/core/type/booltype/NotExpr.kt | 2 +- .../mit/theta/core/type/booltype/XorExpr.kt | 2 +- .../theta/core/type/enumtype/EnumEqExpr.kt | 4 +- .../theta/core/type/enumtype/EnumNeqExpr.kt | 4 +- .../mit/theta/core/type/inttype/IntAddExpr.kt | 92 +++----- .../mit/theta/core/type/inttype/IntDivExpr.kt | 101 +++----- .../mit/theta/core/type/inttype/IntEqExpr.kt | 106 +++------ .../mit/theta/core/type/inttype/IntExprs.kt | 170 +++----------- .../mit/theta/core/type/inttype/IntGeqExpr.kt | 106 +++------ .../mit/theta/core/type/inttype/IntGtExpr.kt | 106 +++------ .../mit/theta/core/type/inttype/IntLeqExpr.kt | 106 +++------ .../mit/theta/core/type/inttype/IntLitExpr.kt | 219 ++++++------------ .../mit/theta/core/type/inttype/IntLtExpr.kt | 106 +++------ .../mit/theta/core/type/inttype/IntModExpr.kt | 100 +++----- .../mit/theta/core/type/inttype/IntMulExpr.kt | 106 +++------ .../mit/theta/core/type/inttype/IntNegExpr.kt | 85 +++---- .../mit/theta/core/type/inttype/IntNeqExpr.kt | 106 +++------ .../mit/theta/core/type/inttype/IntPosExpr.kt | 85 +++---- .../mit/theta/core/type/inttype/IntRemExpr.kt | 101 +++----- .../mit/theta/core/type/inttype/IntSubExpr.kt | 100 +++----- .../theta/core/type/inttype/IntToRatExpr.kt | 89 +++---- .../mit/theta/core/type/inttype/IntType.kt | 175 ++++---------- 29 files changed, 623 insertions(+), 1478 deletions(-) diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/BinaryExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/BinaryExpr.kt index 0a6cd6f300..b39971cc65 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/BinaryExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/BinaryExpr.kt @@ -43,7 +43,7 @@ abstract class BinaryExpr : Expr { return with(newLeftOp, newRightOp) } - fun with(leftOp: Expr, rightOp: Expr): BinaryExpr = + open fun with(leftOp: Expr, rightOp: Expr): BinaryExpr = if (leftOp == this.leftOp && rightOp == this.rightOp) { this } else { diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/MultiaryExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/MultiaryExpr.kt index 12a083f3e3..0c81af0503 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/MultiaryExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/MultiaryExpr.kt @@ -44,5 +44,12 @@ abstract class MultiaryExpr : Expr { override fun toString(): String = Utils.lispStringBuilder(operatorLabel).body().addAll(ops).toString() - abstract fun with(ops: Iterable>): MultiaryExpr + open fun with(ops: Iterable>): MultiaryExpr = + if (ops.toList() == this.ops) { + this + } else { + of(ops.toList()) + } + + protected abstract fun of(ops: List>): MultiaryExpr } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/UnaryExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/UnaryExpr.kt index 59190aac6a..54875e123d 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/UnaryExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/UnaryExpr.kt @@ -44,7 +44,10 @@ abstract class UnaryExpr : Expr { override fun toString(): String = Utils.lispStringBuilder(operatorLabel).body().add(op).toString() - abstract fun with(op: Expr): UnaryExpr + open fun with(op: Expr): UnaryExpr = + if (op == this.op) this else of(op) + + protected abstract fun of(op: Expr): UnaryExpr protected abstract val operatorLabel: String } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/PrimeExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/PrimeExpr.kt index 929169e875..758d612b68 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/PrimeExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/PrimeExpr.kt @@ -47,7 +47,7 @@ data class PrimeExpr( throw UnsupportedOperationException("Prime expressions cannot be evaluated") } - override fun with(op: Expr): PrimeExpr = if (op == this.op) this else of(op) + override fun of(op: Expr): PrimeExpr = Companion.of(op) override val operatorLabel: String = OPERATOR_LABEL } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayEqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayEqExpr.kt index d0ee729f45..76889aeed1 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayEqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayEqExpr.kt @@ -51,8 +51,8 @@ data class ArrayEqExpr( override fun of( leftOp: Expr>, rightOp: Expr> - ): BinaryExpr, BoolType> = - ArrayEqExpr(leftOp, rightOp) + ): ArrayEqExpr = + Companion.of(leftOp, rightOp) override val operatorLabel: String = OPERATOR_LABEL diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayNeqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayNeqExpr.kt index 87db20231c..65a41c8422 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayNeqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayNeqExpr.kt @@ -50,8 +50,8 @@ data class ArrayNeqExpr( override fun of( leftOp: Expr>, rightOp: Expr> - ): BinaryExpr, BoolType> = - ArrayNeqExpr(leftOp, rightOp) + ): ArrayNeqExpr = + Companion.of(leftOp, rightOp) override val operatorLabel: String = OPERATOR_LABEL diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/AndExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/AndExpr.kt index 315fb3acab..76d8867730 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/AndExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/AndExpr.kt @@ -31,8 +31,8 @@ data class AndExpr( override fun eval(`val`: Valuation): BoolLitExpr = if (ops.any { !(it.eval(`val`) as BoolLitExpr).value }) False() else True() - override fun with(ops: Iterable>): AndExpr = - if (ops.toList() == this.ops) this else AndExpr(ops.toList()) + override fun of(ops: List>): AndExpr = + Companion.of(ops) override fun toString(): String = Utils.lispStringBuilder(OPERATOR_LABEL).add(ops).toString() override val operatorLabel: String get() = OPERATOR_LABEL diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/NotExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/NotExpr.kt index 031ea0e036..4bf9a3091b 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/NotExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/NotExpr.kt @@ -27,7 +27,7 @@ data class NotExpr( override val type: BoolType = Bool() override fun eval(`val`: Valuation): BoolLitExpr = Bool(!(op.eval(`val`) as BoolLitExpr).value) - override fun with(op: Expr): NotExpr = if (op == this.op) this else NotExpr(op) + override fun of(op: Expr): NotExpr = NotExpr(op) override fun toString(): String = Utils.lispStringBuilder(OPERATOR_LABEL).add(op).toString() override val operatorLabel: String = OPERATOR_LABEL } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/XorExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/XorExpr.kt index 67cc4c58b8..59804532a9 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/XorExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/XorExpr.kt @@ -31,7 +31,7 @@ data class XorExpr( Bool((leftOp.eval(`val`) as BoolLitExpr).value != (rightOp.eval(`val`) as BoolLitExpr).value) override fun of(leftOp: Expr, rightOp: Expr): XorExpr = - XorExpr(leftOp, rightOp) + Companion.of(leftOp, rightOp) override fun toString(): String = Utils.lispStringBuilder(OPERATOR_LABEL).add(leftOp).add(rightOp).toString() override val operatorLabel: String get() = OPERATOR_LABEL diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumEqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumEqExpr.kt index b25fc8146d..841b88b998 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumEqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumEqExpr.kt @@ -30,8 +30,8 @@ data class EnumEqExpr( override fun eval(`val`: Valuation): LitExpr = EnumLitExpr.eq(leftOp.eval(`val`) as EnumLitExpr, rightOp.eval(`val`) as EnumLitExpr) - override fun of(leftOp: Expr, rightOp: Expr): BinaryExpr = - of(leftOp, rightOp) + override fun of(leftOp: Expr, rightOp: Expr): EnumEqExpr = + Companion.of(leftOp, rightOp) override fun toString(): String = Utils.lispStringBuilder(OPERATOR_LABEL) .body() diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumNeqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumNeqExpr.kt index a4e30cdcb8..99603a7409 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumNeqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumNeqExpr.kt @@ -30,8 +30,8 @@ data class EnumNeqExpr( override fun eval(`val`: Valuation): LitExpr = EnumLitExpr.neq(leftOp.eval(`val`) as EnumLitExpr, rightOp.eval(`val`) as EnumLitExpr) - override fun of(leftOp: Expr, rightOp: Expr): BinaryExpr = - of(leftOp, rightOp) + override fun of(leftOp: Expr, rightOp: Expr): EnumNeqExpr = + Companion.of(leftOp, rightOp) override fun toString(): String = Utils.lispStringBuilder(OPERATOR_LABEL) .body() diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntAddExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntAddExpr.kt index 0302063837..8b8d7976fa 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntAddExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntAddExpr.kt @@ -13,78 +13,48 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.inttype; -import static com.google.common.collect.ImmutableList.toImmutableList; -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; +package hu.bme.mit.theta.core.type.inttype -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.AddExpr; -import java.math.BigInteger; -import java.util.List; +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.AddExpr +import hu.bme.mit.theta.core.type.inttype.IntExprs.Int +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import java.math.BigInteger -public final class IntAddExpr extends AddExpr { +@Serializable +@SerialName("IntAdd") +data class IntAddExpr( + override val ops: List> +) : AddExpr() { - private static final int HASH_SEED = 5653; - private static final String OPERATOR_LABEL = "+"; + companion object { - private IntAddExpr(final Iterable> ops) { - super(ops); - } - - public static IntAddExpr of(final Iterable> ops) { - return new IntAddExpr(ops); - } + internal const val OPERATOR_LABEL = "+" - public static IntAddExpr create(final List> ops) { - return IntAddExpr.of(ops.stream().map(op -> cast(op, Int())).collect(toImmutableList())); - } + @JvmStatic + fun of(ops: Iterable>) = IntAddExpr(ops.toList()) - @Override - public IntType getType() { - return Int(); + @JvmStatic + fun create(ops: List>) = IntAddExpr(ops.map { cast(it, Int()) }) } - @Override - public IntLitExpr eval(final Valuation val) { - var sum = BigInteger.ZERO; - for (final Expr op : getOps()) { - final IntLitExpr opVal = (IntLitExpr) op.eval(val); - sum = sum.add(opVal.getValue()); + override val type: IntType = Int() + override fun eval(`val`: Valuation): IntLitExpr { + var sum = BigInteger.ZERO + ops.forEach { op -> + val opVal = op.eval(`val`) as IntLitExpr + sum = sum.add(opVal.value) } - return Int(sum); + return Int(sum) } - @Override - public IntAddExpr with(final Iterable> ops) { - if (ops == getOps()) { - return this; - } else { - return IntAddExpr.of(ops); - } - } + override fun of(ops: List>): IntAddExpr = + Companion.of(ops) - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final IntAddExpr that = (IntAddExpr) obj; - return this.getOps().equals(that.getOps()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } + override val operatorLabel: String get() = OPERATOR_LABEL } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntDivExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntDivExpr.kt index ea68a4f0ef..c1e4755085 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntDivExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntDivExpr.kt @@ -13,86 +13,43 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.inttype; -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; +package hu.bme.mit.theta.core.type.inttype -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.DivExpr; +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.DivExpr +import hu.bme.mit.theta.core.type.inttype.IntExprs.Int +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -public final class IntDivExpr extends DivExpr { +@Serializable +@SerialName("IntDiv") +data class IntDivExpr( + override val leftOp: Expr, + override val rightOp: Expr +) : DivExpr() { - private static final int HASH_SEED = 79; + companion object { - private static final String OPERATOR_LABEL = "div"; - - private IntDivExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - } - - public static IntDivExpr of(final Expr leftOp, final Expr rightOp) { - return new IntDivExpr(leftOp, rightOp); - } - - public static IntDivExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = cast(leftOp, Int()); - final Expr newRightOp = cast(rightOp, Int()); - return IntDivExpr.of(newLeftOp, newRightOp); - } - - @Override - public IntType getType() { - return Int(); - } - - @Override - public IntLitExpr eval(final Valuation val) { - final IntLitExpr leftOpVal = (IntLitExpr) getLeftOp().eval(val); - final IntLitExpr rightOpVal = (IntLitExpr) getRightOp().eval(val); - return leftOpVal.div(rightOpVal); + internal const val OPERATOR_LABEL = "div" + @JvmStatic + fun of(leftOp: Expr, rightOp: Expr) = IntDivExpr(leftOp, rightOp) + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = IntDivExpr(cast(leftOp, Int()), cast(rightOp, Int())) } - @Override - public IntDivExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return IntDivExpr.of(leftOp, rightOp); - } + override val type: IntType = Int() + override fun eval(`val`: Valuation): IntLitExpr { + val leftOpVal = leftOp.eval(`val`) as IntLitExpr + val rightOpVal = rightOp.eval(`val`) as IntLitExpr + return leftOpVal.div(rightOpVal) } - @Override - public IntDivExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } - - @Override - public IntDivExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final IntDivExpr that = (IntDivExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } + override fun of(leftOp: Expr, rightOp: Expr): IntDivExpr = + Companion.of(leftOp, rightOp) - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } + override val operatorLabel: String get() = OPERATOR_LABEL } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntEqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntEqExpr.kt index 825f429f46..20d97a5ed1 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntEqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntEqExpr.kt @@ -13,88 +13,46 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.inttype; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; +package hu.bme.mit.theta.core.type.inttype -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.EqExpr; -import hu.bme.mit.theta.core.type.booltype.BoolLitExpr; -import hu.bme.mit.theta.core.type.booltype.BoolType; +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.EqExpr +import hu.bme.mit.theta.core.type.booltype.BoolLitExpr +import hu.bme.mit.theta.core.type.booltype.BoolType +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool +import hu.bme.mit.theta.core.type.inttype.IntExprs.Int +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -public final class IntEqExpr extends EqExpr { +@Serializable +@SerialName("IntEq") +data class IntEqExpr( + override val leftOp: Expr, + override val rightOp: Expr +) : EqExpr() { - private static final int HASH_SEED = 2777; - private static final String OPERATOR_LABEL = "="; + companion object { - private IntEqExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); + internal const val OPERATOR_LABEL = "=" + @JvmStatic + fun of(leftOp: Expr, rightOp: Expr) = IntEqExpr(leftOp, rightOp) + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = IntEqExpr(cast(leftOp, Int()), cast(rightOp, Int())) } - public static IntEqExpr of(final Expr leftOp, final Expr rightOp) { - return new IntEqExpr(leftOp, rightOp); + override val type: BoolType = Bool() + override fun eval(`val`: Valuation): BoolLitExpr { + val leftOpVal = leftOp.eval(`val`) as IntLitExpr + val rightOpVal = rightOp.eval(`val`) as IntLitExpr + return leftOpVal.eq(rightOpVal) } - public static IntEqExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = cast(leftOp, Int()); - final Expr newRightOp = cast(rightOp, Int()); - return IntEqExpr.of(newLeftOp, newRightOp); - } - - @Override - public BoolType getType() { - return Bool(); - } - - @Override - public BoolLitExpr eval(final Valuation val) { - final IntLitExpr leftOpVal = (IntLitExpr) getLeftOp().eval(val); - final IntLitExpr rightOpVal = (IntLitExpr) getRightOp().eval(val); - return leftOpVal.eq(rightOpVal); - } - - @Override - public IntEqExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return IntEqExpr.of(leftOp, rightOp); - } - } - - @Override - public IntEqExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } + override fun of(leftOp: Expr, rightOp: Expr): IntEqExpr = + Companion.of(leftOp, rightOp) - @Override - public IntEqExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final IntEqExpr that = (IntEqExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } + override val operatorLabel: String get() = OPERATOR_LABEL } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntExprs.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntExprs.kt index 1ef69c8cf5..42f2cf2b64 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntExprs.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntExprs.kt @@ -13,147 +13,37 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.inttype; -import com.google.common.collect.ImmutableList; -import hu.bme.mit.theta.core.type.Expr; -import java.math.BigInteger; +package hu.bme.mit.theta.core.type.inttype -public final class IntExprs { +import hu.bme.mit.theta.core.type.Expr +import java.math.BigInteger - private IntExprs() {} - - public static IntType Int() { - return IntType.getInstance(); - } - - public static IntLitExpr Int(final int value) { - return IntLitExpr.of(BigInteger.valueOf(value)); - } - - public static IntLitExpr Int(final String value) { - return IntLitExpr.of(new BigInteger(value)); - } - - public static IntLitExpr Int(final BigInteger value) { - return IntLitExpr.of(value); - } - - public static IntToRatExpr ToRat(final Expr op) { - return IntToRatExpr.of(op); - } - - public static IntAddExpr Add(final Iterable> ops) { - return IntAddExpr.of(ops); - } - - public static IntSubExpr Sub(final Expr leftOp, final Expr rightOp) { - return IntSubExpr.of(leftOp, rightOp); - } - - public static IntPosExpr Pos(final Expr op) { - return IntPosExpr.of(op); - } - - public static IntNegExpr Neg(final Expr op) { - return IntNegExpr.of(op); - } - - public static IntMulExpr Mul(final Iterable> ops) { - return IntMulExpr.of(ops); - } - - public static IntDivExpr Div(final Expr leftOp, final Expr rightOp) { - return IntDivExpr.of(leftOp, rightOp); - } - - public static IntModExpr Mod(final Expr leftOp, final Expr rightOp) { - return IntModExpr.of(leftOp, rightOp); - } - - public static IntRemExpr Rem(final Expr leftOp, final Expr rightOp) { - return IntRemExpr.of(leftOp, rightOp); - } - - public static IntEqExpr Eq(final Expr leftOp, final Expr rightOp) { - return IntEqExpr.of(leftOp, rightOp); - } - - public static IntNeqExpr Neq(final Expr leftOp, final Expr rightOp) { - return IntNeqExpr.of(leftOp, rightOp); - } - - public static IntLtExpr Lt(final Expr leftOp, final Expr rightOp) { - return IntLtExpr.of(leftOp, rightOp); - } - - public static IntLeqExpr Leq(final Expr leftOp, final Expr rightOp) { - return IntLeqExpr.of(leftOp, rightOp); - } - - public static IntGtExpr Gt(final Expr leftOp, final Expr rightOp) { - return IntGtExpr.of(leftOp, rightOp); - } - - public static IntGeqExpr Geq(final Expr leftOp, final Expr rightOp) { - return IntGeqExpr.of(leftOp, rightOp); - } - - /* - * Convenience methods - */ - - public static IntAddExpr Add(final Expr op1, final Expr op2) { - return IntAddExpr.of(ImmutableList.of(op1, op2)); - } - - public static IntAddExpr Add( - final Expr op1, final Expr op2, final Expr op3) { - return IntAddExpr.of(ImmutableList.of(op1, op2, op3)); - } - - public static IntAddExpr Add( - final Expr op1, - final Expr op2, - final Expr op3, - final Expr op4) { - return IntAddExpr.of(ImmutableList.of(op1, op2, op3, op4)); - } - - public static IntAddExpr Add( - final Expr op1, - final Expr op2, - final Expr op3, - final Expr op4, - final Expr op5) { - return IntAddExpr.of(ImmutableList.of(op1, op2, op3, op4, op5)); - } - - //// - - public static IntMulExpr Mul(final Expr op1, final Expr op2) { - return IntMulExpr.of(ImmutableList.of(op1, op2)); - } - - public static IntMulExpr Mul( - final Expr op1, final Expr op2, final Expr op3) { - return IntMulExpr.of(ImmutableList.of(op1, op2, op3)); - } - - public static IntMulExpr Mul( - final Expr op1, - final Expr op2, - final Expr op3, - final Expr op4) { - return IntMulExpr.of(ImmutableList.of(op1, op2, op3, op4)); - } - - public static IntMulExpr Mul( - final Expr op1, - final Expr op2, - final Expr op3, - final Expr op4, - final Expr op5) { - return IntMulExpr.of(ImmutableList.of(op1, op2, op3, op4, op5)); - } +/** + * Factory and utility methods for integer expressions. + */ +@Suppress("FunctionName") +object IntExprs { + fun Int() = IntType + fun Int(value: Int) = IntLitExpr(BigInteger.valueOf(value.toLong())) + fun Int(value: String) = IntLitExpr(BigInteger(value)) + fun Int(value: BigInteger) = IntLitExpr(value) + fun ToRat(op: Expr) = IntToRatExpr(op) + fun Add(ops: Iterable>) = IntAddExpr.of(ops) + fun Add(vararg ops: Expr) = IntAddExpr(ops.asList()) + fun Sub(leftOp: Expr, rightOp: Expr) = IntSubExpr(leftOp, rightOp) + fun Pos(op: Expr) = IntPosExpr(op) + fun Neg(op: Expr) = IntNegExpr(op) + fun Mul(ops: Iterable>) = IntMulExpr.of(ops) + fun Mul(vararg ops: Expr) = IntMulExpr(ops.asList()) + fun Div(leftOp: Expr, rightOp: Expr) = IntDivExpr(leftOp, rightOp) + fun Mod(leftOp: Expr, rightOp: Expr) = IntModExpr(leftOp, rightOp) + fun Rem(leftOp: Expr, rightOp: Expr) = IntRemExpr(leftOp, rightOp) + fun Eq(leftOp: Expr, rightOp: Expr) = IntEqExpr(leftOp, rightOp) + fun Neq(leftOp: Expr, rightOp: Expr) = IntNeqExpr(leftOp, rightOp) + fun Lt(leftOp: Expr, rightOp: Expr) = IntLtExpr(leftOp, rightOp) + fun Leq(leftOp: Expr, rightOp: Expr) = IntLeqExpr(leftOp, rightOp) + fun Gt(leftOp: Expr, rightOp: Expr) = IntGtExpr(leftOp, rightOp) + fun Geq(leftOp: Expr, rightOp: Expr) = IntGeqExpr(leftOp, rightOp) } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntGeqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntGeqExpr.kt index 92f24c78de..ed93957d3a 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntGeqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntGeqExpr.kt @@ -13,88 +13,46 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.inttype; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; +package hu.bme.mit.theta.core.type.inttype -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.GeqExpr; -import hu.bme.mit.theta.core.type.booltype.BoolLitExpr; -import hu.bme.mit.theta.core.type.booltype.BoolType; +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.GeqExpr +import hu.bme.mit.theta.core.type.booltype.BoolLitExpr +import hu.bme.mit.theta.core.type.booltype.BoolType +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool +import hu.bme.mit.theta.core.type.inttype.IntExprs.Int +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -public final class IntGeqExpr extends GeqExpr { +@Serializable +@SerialName("IntGeq") +data class IntGeqExpr( + override val leftOp: Expr, + override val rightOp: Expr +) : GeqExpr() { - private static final int HASH_SEED = 7649; - private static final String OPERATOR_LABEL = ">="; + companion object { - private IntGeqExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); + internal const val OPERATOR_LABEL = ">=" + @JvmStatic + fun of(leftOp: Expr, rightOp: Expr) = IntGeqExpr(leftOp, rightOp) + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = IntGeqExpr(cast(leftOp, Int()), cast(rightOp, Int())) } - public static IntGeqExpr of(final Expr leftOp, final Expr rightOp) { - return new IntGeqExpr(leftOp, rightOp); + override val type: BoolType = Bool() + override fun eval(`val`: Valuation): BoolLitExpr { + val leftOpVal = leftOp.eval(`val`) as IntLitExpr + val rightOpVal = rightOp.eval(`val`) as IntLitExpr + return leftOpVal.geq(rightOpVal) } - public static IntGeqExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = cast(leftOp, Int()); - final Expr newRightOp = cast(rightOp, Int()); - return IntGeqExpr.of(newLeftOp, newRightOp); - } - - @Override - public BoolType getType() { - return Bool(); - } - - @Override - public BoolLitExpr eval(final Valuation val) { - final IntLitExpr leftOpVal = (IntLitExpr) getLeftOp().eval(val); - final IntLitExpr rightOpVal = (IntLitExpr) getRightOp().eval(val); - return leftOpVal.geq(rightOpVal); - } - - @Override - public IntGeqExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return IntGeqExpr.of(leftOp, rightOp); - } - } - - @Override - public IntGeqExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } + override fun of(leftOp: Expr, rightOp: Expr): IntGeqExpr = + Companion.of(leftOp, rightOp) - @Override - public IntGeqExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final IntGeqExpr that = (IntGeqExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } + override val operatorLabel: String get() = OPERATOR_LABEL } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntGtExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntGtExpr.kt index fa6ff21239..49b9a4e924 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntGtExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntGtExpr.kt @@ -13,88 +13,46 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.inttype; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; +package hu.bme.mit.theta.core.type.inttype -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.GtExpr; -import hu.bme.mit.theta.core.type.booltype.BoolLitExpr; -import hu.bme.mit.theta.core.type.booltype.BoolType; +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.GtExpr +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool +import hu.bme.mit.theta.core.type.booltype.BoolLitExpr +import hu.bme.mit.theta.core.type.booltype.BoolType +import hu.bme.mit.theta.core.type.inttype.IntExprs.Int +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -public final class IntGtExpr extends GtExpr { +@Serializable +@SerialName("IntGt") +data class IntGtExpr( + override val leftOp: Expr, + override val rightOp: Expr +) : GtExpr() { - private static final int HASH_SEED = 7349; - private static final String OPERATOR_LABEL = ">"; + companion object { - private IntGtExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); + internal const val OPERATOR_LABEL = ">" + @JvmStatic + fun of(leftOp: Expr, rightOp: Expr) = IntGtExpr(leftOp, rightOp) + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = IntGtExpr(cast(leftOp, Int()), cast(rightOp, Int())) } - public static IntGtExpr of(final Expr leftOp, final Expr rightOp) { - return new IntGtExpr(leftOp, rightOp); + override val type: BoolType = Bool() + override fun eval(`val`: Valuation): BoolLitExpr { + val leftOpVal = leftOp.eval(`val`) as IntLitExpr + val rightOpVal = rightOp.eval(`val`) as IntLitExpr + return leftOpVal.gt(rightOpVal) } - public static IntGtExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = cast(leftOp, Int()); - final Expr newRightOp = cast(rightOp, Int()); - return IntGtExpr.of(newLeftOp, newRightOp); - } - - @Override - public BoolType getType() { - return Bool(); - } - - @Override - public BoolLitExpr eval(final Valuation val) { - final IntLitExpr leftOpVal = (IntLitExpr) getLeftOp().eval(val); - final IntLitExpr rightOpVal = (IntLitExpr) getRightOp().eval(val); - return leftOpVal.gt(rightOpVal); - } - - @Override - public IntGtExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return IntGtExpr.of(leftOp, rightOp); - } - } - - @Override - public IntGtExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } + override fun of(leftOp: Expr, rightOp: Expr): IntGtExpr = + Companion.of(leftOp, rightOp) - @Override - public IntGtExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final IntGtExpr that = (IntGtExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } + override val operatorLabel: String get() = OPERATOR_LABEL } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLeqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLeqExpr.kt index 0f20b63c49..5e35e87b27 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLeqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLeqExpr.kt @@ -13,88 +13,46 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.inttype; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; +package hu.bme.mit.theta.core.type.inttype -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.LeqExpr; -import hu.bme.mit.theta.core.type.booltype.BoolLitExpr; -import hu.bme.mit.theta.core.type.booltype.BoolType; +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.LeqExpr +import hu.bme.mit.theta.core.type.booltype.BoolLitExpr +import hu.bme.mit.theta.core.type.booltype.BoolType +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool +import hu.bme.mit.theta.core.type.inttype.IntExprs.Int +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -public final class IntLeqExpr extends LeqExpr { +@Serializable +@SerialName("IntLeq") +data class IntLeqExpr( + override val leftOp: Expr, + override val rightOp: Expr +) : LeqExpr() { - private static final int HASH_SEED = 4673; - private static final String OPERATOR_LABEL = "<="; + companion object { - private IntLeqExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); + internal const val OPERATOR_LABEL = "<=" + @JvmStatic + fun of(leftOp: Expr, rightOp: Expr) = IntLeqExpr(leftOp, rightOp) + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = IntLeqExpr(cast(leftOp, Int()), cast(rightOp, Int())) } - public static IntLeqExpr of(final Expr leftOp, final Expr rightOp) { - return new IntLeqExpr(leftOp, rightOp); + override val type: BoolType = Bool() + override fun eval(`val`: Valuation): BoolLitExpr { + val leftOpVal = leftOp.eval(`val`) as IntLitExpr + val rightOpVal = rightOp.eval(`val`) as IntLitExpr + return leftOpVal.leq(rightOpVal) } - public static IntLeqExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = cast(leftOp, Int()); - final Expr newRightOp = cast(rightOp, Int()); - return IntLeqExpr.of(newLeftOp, newRightOp); - } - - @Override - public BoolType getType() { - return Bool(); - } - - @Override - public BoolLitExpr eval(final Valuation val) { - final IntLitExpr leftOpVal = (IntLitExpr) getLeftOp().eval(val); - final IntLitExpr rightOpVal = (IntLitExpr) getRightOp().eval(val); - return leftOpVal.leq(rightOpVal); - } - - @Override - public IntLeqExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return IntLeqExpr.of(leftOp, rightOp); - } - } - - @Override - public IntLeqExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } + override fun of(leftOp: Expr, rightOp: Expr): IntLeqExpr = + Companion.of(leftOp, rightOp) - @Override - public IntLeqExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final IntLeqExpr that = (IntLeqExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } + override val operatorLabel: String get() = OPERATOR_LABEL } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLitExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLitExpr.kt index ddb5e064c9..a2fc571c82 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLitExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLitExpr.kt @@ -13,181 +13,102 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.inttype; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; -import static hu.bme.mit.theta.core.type.rattype.RatExprs.Rat; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.type.NullaryExpr; -import hu.bme.mit.theta.core.type.booltype.BoolLitExpr; -import hu.bme.mit.theta.core.type.rattype.RatLitExpr; -import java.math.BigInteger; - -public final class IntLitExpr extends NullaryExpr - implements LitExpr, Comparable { - - private static final int HASH_SEED = 4111; - private volatile int hashCode = 0; - - private final BigInteger value; - - private IntLitExpr(final BigInteger value) { - this.value = value; - } - - public static IntLitExpr of(final BigInteger value) { - return new IntLitExpr(value); - } - - public BigInteger getValue() { - return value; - } - - @Override - public IntType getType() { - return Int(); - } - - @Override - public IntLitExpr eval(final Valuation val) { - return this; - } - - public RatLitExpr toRat() { - return Rat(this.value, 1); - } - - public IntLitExpr add(final IntLitExpr that) { - return IntLitExpr.of(this.value.add(that.value)); - } - - public IntLitExpr sub(final IntLitExpr that) { - return IntLitExpr.of(this.value.subtract(that.value)); - } - - public IntLitExpr neg() { - return IntLitExpr.of(this.value.negate()); - } - - public IntLitExpr pos() { - return IntLitExpr.of(this.value); - } - - public IntLitExpr div(final IntLitExpr that) { +package hu.bme.mit.theta.core.type.inttype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.serialization.BigIntegerSerializer +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.type.NullaryExpr +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool +import hu.bme.mit.theta.core.type.inttype.IntExprs.Int +import hu.bme.mit.theta.core.type.rattype.RatExprs.Rat +import hu.bme.mit.theta.core.type.rattype.RatLitExpr +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import java.math.BigInteger + +@Serializable +@SerialName("IntLit") +data class IntLitExpr( + @Serializable(with = BigIntegerSerializer::class) + val value: BigInteger +) : NullaryExpr(), LitExpr, Comparable { + + companion object { + + @JvmStatic + fun of(value: BigInteger) = IntLitExpr(value) + } + + override val type: IntType = Int() + override fun eval(`val`: Valuation): IntLitExpr = this + fun toRat(): RatLitExpr = Rat(this.value, 1) + fun add(that: IntLitExpr) = IntLitExpr(this.value.add(that.value)) + fun sub(that: IntLitExpr) = IntLitExpr(this.value.subtract(that.value)) + fun neg() = IntLitExpr(this.value.negate()) + fun pos() = IntLitExpr(this.value) + + fun div(that: IntLitExpr): IntLitExpr { // Semantics: // 5 div 3 = 1 // 5 div -3 = -1 // -5 div 3 = -2 // -5 div -3 = 2 - var result = this.value.divide(that.value); - if (this.value.compareTo(BigInteger.ZERO) < 0 - && this.value.mod(that.value.abs()).compareTo(BigInteger.ZERO) != 0) { - result = result.subtract(BigInteger.valueOf(that.value.signum())); + var result = this.value.divide(that.value) + if (this.value < BigInteger.ZERO && this.value.mod(that.value.abs()) != BigInteger.ZERO) { + result = result.subtract(BigInteger.valueOf(that.value.signum().toLong())) } - return IntLitExpr.of(result); + return IntLitExpr(result) } - public IntLitExpr mod(final IntLitExpr that) { + fun mod(that: IntLitExpr): IntLitExpr { // Always positive semantics: // 5 mod 3 = 2 // 5 mod -3 = 2 // -5 mod 3 = 1 // -5 mod -3 = 1 - var result = this.value.mod(that.value.abs()); - if (result.compareTo(BigInteger.ZERO) < 0) { - result = result.add(that.value.abs()); + var result = this.value.mod(that.value.abs()) + if (result < BigInteger.ZERO) { + result = result.add(that.value.abs()) } - assert result.compareTo(BigInteger.ZERO) >= 0; - return IntLitExpr.of(result); + require(result >= BigInteger.ZERO) + return IntLitExpr(result) } - public IntLitExpr rem(final IntLitExpr that) { + fun rem(that: IntLitExpr): IntLitExpr { // Semantics: // 5 rem 3 = 2 // 5 rem -3 = -2 // -5 rem 3 = 1 // -5 rem -3 = -1 - final var thisAbs = this.value.abs(); - final var thatAbs = that.value.abs(); - if (this.value.compareTo(BigInteger.ZERO) < 0 - && that.value.compareTo(BigInteger.ZERO) < 0) { - var result = thisAbs.mod(thatAbs); - if (result.compareTo(BigInteger.ZERO) != 0) { - result = result.subtract(thatAbs); - } - return new IntLitExpr(result); - } else if (this.value.compareTo(BigInteger.ZERO) >= 0 - && that.value.compareTo(BigInteger.ZERO) < 0) { - return new IntLitExpr(thisAbs.mod(thatAbs).negate()); - } else if (this.value.compareTo(BigInteger.ZERO) < 0 - && that.value.compareTo(BigInteger.ZERO) >= 0) { - var result = thisAbs.mod(thatAbs); - if (result.compareTo(BigInteger.ZERO) != 0) { - result = thatAbs.subtract(result); + val thisAbs = this.value.abs() + val thatAbs = that.value.abs() + return when { + this.value < BigInteger.ZERO && that.value < BigInteger.ZERO -> { + var result = thisAbs.mod(thatAbs) + if (result != BigInteger.ZERO) result = result.subtract(thatAbs) + IntLitExpr(result) } - return IntLitExpr.of(result); - } else { - return IntLitExpr.of(this.value.mod(that.value)); - } - } - - public BoolLitExpr eq(final IntLitExpr that) { - return Bool(this.value.compareTo(that.value) == 0); - } - - public BoolLitExpr neq(final IntLitExpr that) { - return Bool(this.value.compareTo(that.value) != 0); - } - - public BoolLitExpr lt(final IntLitExpr that) { - return Bool(this.value.compareTo(that.value) < 0); - } - - public BoolLitExpr leq(final IntLitExpr that) { - return Bool(this.value.compareTo(that.value) <= 0); - } - public BoolLitExpr gt(final IntLitExpr that) { - return Bool(this.value.compareTo(that.value) > 0); - } - - public BoolLitExpr geq(final IntLitExpr that) { - return Bool(this.value.compareTo(that.value) >= 0); - } - - @Override - public int hashCode() { - int result = hashCode; - if (result == 0) { - result = HASH_SEED; - result = 31 * result + value.hashCode(); - hashCode = result; - } - return result; - } + this.value >= BigInteger.ZERO && that.value < BigInteger.ZERO -> IntLitExpr(thisAbs.mod(thatAbs).negate()) + this.value < BigInteger.ZERO && that.value >= BigInteger.ZERO -> { + var result = thisAbs.mod(thatAbs) + if (result != BigInteger.ZERO) result = thatAbs.subtract(result) + IntLitExpr(result) + } - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final IntLitExpr that = (IntLitExpr) obj; - return this.getValue().compareTo(that.getValue()) == 0; - } else { - return false; + else -> IntLitExpr(this.value.mod(that.value)) } } - @Override - public String toString() { - return getValue().toString(); - } - - @Override - public int compareTo(final IntLitExpr that) { - return this.getValue().compareTo(that.getValue()); - } + fun eq(that: IntLitExpr) = Bool(this.value == that.value) + fun neq(that: IntLitExpr) = Bool(this.value != that.value) + fun lt(that: IntLitExpr) = Bool(this.value < that.value) + fun leq(that: IntLitExpr) = Bool(this.value <= that.value) + fun gt(that: IntLitExpr) = Bool(this.value > that.value) + fun geq(that: IntLitExpr) = Bool(this.value >= that.value) + override fun compareTo(other: IntLitExpr): Int = this.value.compareTo(other.value) + override fun toString(): String = value.toString() } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLtExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLtExpr.kt index a1bd3fbe07..4981a282b6 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLtExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLtExpr.kt @@ -13,88 +13,46 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.inttype; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; +package hu.bme.mit.theta.core.type.inttype -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.type.abstracttype.LtExpr; -import hu.bme.mit.theta.core.type.booltype.BoolType; +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.LtExpr +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool +import hu.bme.mit.theta.core.type.booltype.BoolLitExpr +import hu.bme.mit.theta.core.type.booltype.BoolType +import hu.bme.mit.theta.core.type.inttype.IntExprs.Int +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -public final class IntLtExpr extends LtExpr { +@Serializable +@SerialName("IntLt") +data class IntLtExpr( + override val leftOp: Expr, + override val rightOp: Expr +) : LtExpr() { - private static final int HASH_SEED = 9431; - private static final String OPERATOR_LABEL = "<"; + companion object { - private IntLtExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); + internal const val OPERATOR_LABEL = "<" + @JvmStatic + fun of(leftOp: Expr, rightOp: Expr) = IntLtExpr(leftOp, rightOp) + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = IntLtExpr(cast(leftOp, Int()), cast(rightOp, Int())) } - public static IntLtExpr of(final Expr leftOp, final Expr rightOp) { - return new IntLtExpr(leftOp, rightOp); + override val type: BoolType = Bool() + override fun eval(`val`: Valuation): BoolLitExpr { + val leftOpVal = leftOp.eval(`val`) as IntLitExpr + val rightOpVal = rightOp.eval(`val`) as IntLitExpr + return leftOpVal.lt(rightOpVal) } - public static IntLtExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = cast(leftOp, Int()); - final Expr newRightOp = cast(rightOp, Int()); - return IntLtExpr.of(newLeftOp, newRightOp); - } - - @Override - public BoolType getType() { - return Bool(); - } - - @Override - public LitExpr eval(final Valuation val) { - final IntLitExpr leftOpVal = (IntLitExpr) getLeftOp().eval(val); - final IntLitExpr rightOpVal = (IntLitExpr) getRightOp().eval(val); - return leftOpVal.lt(rightOpVal); - } - - @Override - public IntLtExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return IntLtExpr.of(leftOp, rightOp); - } - } - - @Override - public IntLtExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } + override fun of(leftOp: Expr, rightOp: Expr): IntLtExpr = + Companion.of(leftOp, rightOp) - @Override - public IntLtExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final IntLtExpr that = (IntLtExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } + override val operatorLabel: String get() = OPERATOR_LABEL } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntModExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntModExpr.kt index f2b1d17948..f52a7dd855 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntModExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntModExpr.kt @@ -13,85 +13,43 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.inttype; -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; +package hu.bme.mit.theta.core.type.inttype -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.ModExpr; +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.ModExpr +import hu.bme.mit.theta.core.type.inttype.IntExprs.Int +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -public final class IntModExpr extends ModExpr { +@Serializable +@SerialName("IntMod") +data class IntModExpr( + override val leftOp: Expr, + override val rightOp: Expr +) : ModExpr() { - private static final int HASH_SEED = 109; - private static final String OPERATOR_LABEL = "mod"; + companion object { - private IntModExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); + internal const val OPERATOR_LABEL = "mod" + @JvmStatic + fun of(leftOp: Expr, rightOp: Expr) = IntModExpr(leftOp, rightOp) + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = IntModExpr(cast(leftOp, Int()), cast(rightOp, Int())) } - public static IntModExpr of(final Expr leftOp, final Expr rightOp) { - return new IntModExpr(leftOp, rightOp); + override val type: IntType = Int() + override fun eval(`val`: Valuation): IntLitExpr { + val leftOpVal = leftOp.eval(`val`) as IntLitExpr + val rightOpVal = rightOp.eval(`val`) as IntLitExpr + return leftOpVal.mod(rightOpVal) } - public static IntModExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = cast(leftOp, Int()); - final Expr newRightOp = cast(rightOp, Int()); - return IntModExpr.of(newLeftOp, newRightOp); - } - - @Override - public IntType getType() { - return Int(); - } - - @Override - public IntLitExpr eval(final Valuation val) { - final IntLitExpr leftOpVal = (IntLitExpr) getLeftOp().eval(val); - final IntLitExpr rightOpVal = (IntLitExpr) getRightOp().eval(val); - return leftOpVal.mod(rightOpVal); - } - - @Override - public IntModExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return IntModExpr.of(leftOp, rightOp); - } - } - - @Override - public IntModExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } + override fun of(leftOp: Expr, rightOp: Expr): IntModExpr = + Companion.of(leftOp, rightOp) - @Override - public IntModExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final IntModExpr that = (IntModExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } + override val operatorLabel: String get() = OPERATOR_LABEL } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntMulExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntMulExpr.kt index ff29c783fd..9047bd30c2 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntMulExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntMulExpr.kt @@ -13,78 +13,46 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.inttype; -import static com.google.common.collect.ImmutableList.toImmutableList; -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.MulExpr; -import java.math.BigInteger; -import java.util.List; - -public final class IntMulExpr extends MulExpr { - - private static final int HASH_SEED = 2707; - private static final String OPERATOR_LABEL = "*"; - - private IntMulExpr(final Iterable> ops) { - super(ops); - } - - public static IntMulExpr of(final Iterable> ops) { - return new IntMulExpr(ops); - } - - public static IntMulExpr create(final List> ops) { - return IntMulExpr.of(ops.stream().map(op -> cast(op, Int())).collect(toImmutableList())); - } - - @Override - public IntType getType() { - return Int(); - } - - @Override - public IntLitExpr eval(final Valuation val) { - var prod = BigInteger.ONE; - for (final Expr op : getOps()) { - final IntLitExpr opVal = (IntLitExpr) op.eval(val); - prod = prod.multiply(opVal.getValue()); - } - return Int(prod); - } - - @Override - public IntMulExpr with(final Iterable> ops) { - if (ops == getOps()) { - return this; - } else { - return IntMulExpr.of(ops); - } - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final IntMulExpr that = (IntMulExpr) obj; - return this.getOps().equals(that.getOps()); - } else { - return false; +package hu.bme.mit.theta.core.type.inttype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.MulExpr +import hu.bme.mit.theta.core.type.inttype.IntExprs.Int +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import java.math.BigInteger + +@Serializable +@SerialName("IntMul") +data class IntMulExpr( + override val ops: List> +) : MulExpr() { + + companion object { + + internal const val OPERATOR_LABEL = "*" + @JvmStatic + fun of(ops: Iterable>) = IntMulExpr(ops.toList()) + @JvmStatic + fun create(ops: List>) = IntMulExpr(ops.map { cast(it, Int()) }) + } + + override val type: IntType = Int() + override fun eval(`val`: Valuation): IntLitExpr { + var prod = BigInteger.ONE + for (op in ops) { + val opVal = op.eval(`val`) as IntLitExpr + prod = prod.multiply(opVal.value) } + return Int(prod) } - @Override - protected int getHashSeed() { - return HASH_SEED; - } + override fun of(ops: List>): IntMulExpr = + Companion.of(ops) - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } + override val operatorLabel: String get() = OPERATOR_LABEL } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntNegExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntNegExpr.kt index 9f7166ef8a..c33725e6d7 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntNegExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntNegExpr.kt @@ -13,72 +13,39 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.inttype; -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; +package hu.bme.mit.theta.core.type.inttype -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.NegExpr; +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.NegExpr +import hu.bme.mit.theta.core.type.inttype.IntExprs.Int +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -public final class IntNegExpr extends NegExpr { +@Serializable +@SerialName("IntNeg") +data class IntNegExpr( + override val op: Expr +) : NegExpr() { - private static final int HASH_SEED = 3359; - private static final String OPERATOR_LABEL = "-"; + companion object { - private IntNegExpr(final Expr op) { - super(op); + internal const val OPERATOR_LABEL = "-" + @JvmStatic + fun of(op: Expr) = IntNegExpr(op) + @JvmStatic + fun create(op: Expr<*>) = IntNegExpr(cast(op, Int())) } - public static IntNegExpr of(final Expr op) { - return new IntNegExpr(op); + override val type: IntType = Int() + override fun eval(`val`: Valuation): IntLitExpr { + val opVal = op.eval(`val`) as IntLitExpr + return opVal.neg() } - public static IntNegExpr create(final Expr op) { - final Expr newOp = cast(op, Int()); - return IntNegExpr.of(newOp); - } - - @Override - public IntType getType() { - return Int(); - } - - @Override - public IntLitExpr eval(final Valuation val) { - final IntLitExpr opVal = (IntLitExpr) getOp().eval(val); - return opVal.neg(); - } - - @Override - public IntNegExpr with(final Expr op) { - if (op == getOp()) { - return this; - } else { - return IntNegExpr.of(op); - } - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final IntNegExpr that = (IntNegExpr) obj; - return this.getOp().equals(that.getOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } + override fun of(op: Expr): IntNegExpr = Companion.of(op) + override val operatorLabel: String get() = OPERATOR_LABEL } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntNeqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntNeqExpr.kt index f9706e01d5..33d74da3ff 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntNeqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntNeqExpr.kt @@ -13,88 +13,46 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.inttype; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; +package hu.bme.mit.theta.core.type.inttype -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.NeqExpr; -import hu.bme.mit.theta.core.type.booltype.BoolLitExpr; -import hu.bme.mit.theta.core.type.booltype.BoolType; +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.NeqExpr +import hu.bme.mit.theta.core.type.booltype.BoolLitExpr +import hu.bme.mit.theta.core.type.booltype.BoolType +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool +import hu.bme.mit.theta.core.type.inttype.IntExprs.Int +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -public final class IntNeqExpr extends NeqExpr { +@Serializable +@SerialName("IntNeq") +data class IntNeqExpr( + override val leftOp: Expr, + override val rightOp: Expr +) : NeqExpr() { - private static final int HASH_SEED = 9397; - private static final String OPERATOR_LABEL = "/="; + companion object { - private IntNeqExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); + internal const val OPERATOR_LABEL = "/=" + @JvmStatic + fun of(leftOp: Expr, rightOp: Expr) = IntNeqExpr(leftOp, rightOp) + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = IntNeqExpr(cast(leftOp, Int()), cast(rightOp, Int())) } - public static IntNeqExpr of(final Expr leftOp, final Expr rightOp) { - return new IntNeqExpr(leftOp, rightOp); + override val type: BoolType = Bool() + override fun eval(`val`: Valuation): BoolLitExpr { + val leftOpVal = leftOp.eval(`val`) as IntLitExpr + val rightOpVal = rightOp.eval(`val`) as IntLitExpr + return leftOpVal.neq(rightOpVal) } - public static IntNeqExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = cast(leftOp, Int()); - final Expr newRightOp = cast(rightOp, Int()); - return IntNeqExpr.of(newLeftOp, newRightOp); - } - - @Override - public BoolType getType() { - return Bool(); - } - - @Override - public BoolLitExpr eval(final Valuation val) { - final IntLitExpr leftOpVal = (IntLitExpr) getLeftOp().eval(val); - final IntLitExpr rightOpVal = (IntLitExpr) getRightOp().eval(val); - return leftOpVal.neq(rightOpVal); - } - - @Override - public IntNeqExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return IntNeqExpr.of(leftOp, rightOp); - } - } - - @Override - public IntNeqExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } + override fun of(leftOp: Expr, rightOp: Expr): IntNeqExpr = + Companion.of(leftOp, rightOp) - @Override - public IntNeqExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final IntNeqExpr that = (IntNeqExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } + override val operatorLabel: String get() = OPERATOR_LABEL } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntPosExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntPosExpr.kt index 223199a3bb..bddf596591 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntPosExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntPosExpr.kt @@ -13,72 +13,39 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.inttype; -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; +package hu.bme.mit.theta.core.type.inttype -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.PosExpr; +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.PosExpr +import hu.bme.mit.theta.core.type.inttype.IntExprs.Int +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -public final class IntPosExpr extends PosExpr { +@Serializable +@SerialName("IntPos") +data class IntPosExpr( + override val op: Expr +) : PosExpr() { - private static final int HASH_SEED = 3547; - private static final String OPERATOR_LABEL = "+"; + companion object { - private IntPosExpr(final Expr op) { - super(op); + internal const val OPERATOR_LABEL = "+" + @JvmStatic + fun of(op: Expr) = IntPosExpr(op) + @JvmStatic + fun create(op: Expr<*>) = IntPosExpr(cast(op, Int())) } - public static IntPosExpr of(final Expr op) { - return new IntPosExpr(op); + override val type: IntType = Int() + override fun eval(`val`: Valuation): IntLitExpr { + val opVal = op.eval(`val`) as IntLitExpr + return opVal.pos() } - public static IntPosExpr create(final Expr op) { - final Expr newOp = cast(op, Int()); - return IntPosExpr.of(newOp); - } - - @Override - public IntType getType() { - return Int(); - } - - @Override - public IntLitExpr eval(final Valuation val) { - final IntLitExpr opVal = (IntLitExpr) getOp().eval(val); - return opVal.pos(); - } - - @Override - public IntPosExpr with(final Expr op) { - if (op == getOp()) { - return this; - } else { - return IntPosExpr.of(op); - } - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final IntPosExpr that = (IntPosExpr) obj; - return this.getOp().equals(that.getOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } + override fun of(op: Expr): IntPosExpr = Companion.of(op) + override val operatorLabel: String get() = OPERATOR_LABEL } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntRemExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntRemExpr.kt index ee807b4e83..e4a2287304 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntRemExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntRemExpr.kt @@ -13,86 +13,43 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.inttype; -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; +package hu.bme.mit.theta.core.type.inttype -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.RemExpr; +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.RemExpr +import hu.bme.mit.theta.core.type.inttype.IntExprs.Int +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -public final class IntRemExpr extends RemExpr { +@Serializable +@SerialName("IntRem") +data class IntRemExpr( + override val leftOp: Expr, + override val rightOp: Expr +) : RemExpr() { - private static final int HASH_SEED = 199; + companion object { - private static final String OPERATOR_LABEL = "rem"; - - private IntRemExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - } - - public static IntRemExpr of(final Expr leftOp, final Expr rightOp) { - return new IntRemExpr(leftOp, rightOp); - } - - public static IntRemExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = cast(leftOp, Int()); - final Expr newRightOp = cast(rightOp, Int()); - return IntRemExpr.of(newLeftOp, newRightOp); - } - - @Override - public IntType getType() { - return Int(); - } - - @Override - public IntLitExpr eval(final Valuation val) { - final IntLitExpr leftOpVal = (IntLitExpr) getLeftOp().eval(val); - final IntLitExpr rightOpVal = (IntLitExpr) getRightOp().eval(val); - return leftOpVal.rem(rightOpVal); + internal const val OPERATOR_LABEL = "rem" + @JvmStatic + fun of(leftOp: Expr, rightOp: Expr) = IntRemExpr(leftOp, rightOp) + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = IntRemExpr(cast(leftOp, Int()), cast(rightOp, Int())) } - @Override - public IntRemExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return IntRemExpr.of(leftOp, rightOp); - } + override val type: IntType = Int() + override fun eval(`val`: Valuation): IntLitExpr { + val leftOpVal = leftOp.eval(`val`) as IntLitExpr + val rightOpVal = rightOp.eval(`val`) as IntLitExpr + return leftOpVal.rem(rightOpVal) } - @Override - public IntRemExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } - - @Override - public IntRemExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final IntRemExpr that = (IntRemExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } + override fun of(leftOp: Expr, rightOp: Expr): IntRemExpr = + Companion.of(leftOp, rightOp) - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } + override val operatorLabel: String get() = OPERATOR_LABEL } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntSubExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntSubExpr.kt index 42d109340a..d244fd87b3 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntSubExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntSubExpr.kt @@ -13,85 +13,43 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.inttype; -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; +package hu.bme.mit.theta.core.type.inttype -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.SubExpr; +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.SubExpr +import hu.bme.mit.theta.core.type.inttype.IntExprs.Int +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -public final class IntSubExpr extends SubExpr { +@Serializable +@SerialName("IntSub") +data class IntSubExpr( + override val leftOp: Expr, + override val rightOp: Expr +) : SubExpr() { - private static final int HASH_SEED = 4547; - private static final String OPERATOR = "-"; + companion object { - private IntSubExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); + internal const val OPERATOR_LABEL = "-" + @JvmStatic + fun of(leftOp: Expr, rightOp: Expr) = IntSubExpr(leftOp, rightOp) + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = IntSubExpr(cast(leftOp, Int()), cast(rightOp, Int())) } - public static IntSubExpr of(final Expr leftOp, final Expr rightOp) { - return new IntSubExpr(leftOp, rightOp); + override val type: IntType = Int() + override fun eval(`val`: Valuation): IntLitExpr { + val leftOpVal = leftOp.eval(`val`) as IntLitExpr + val rightOpVal = rightOp.eval(`val`) as IntLitExpr + return leftOpVal.sub(rightOpVal) } - public static IntSubExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = cast(leftOp, Int()); - final Expr newRightOp = cast(rightOp, Int()); - return IntSubExpr.of(newLeftOp, newRightOp); - } - - @Override - public IntType getType() { - return Int(); - } - - @Override - public IntLitExpr eval(final Valuation val) { - final IntLitExpr leftOpVal = (IntLitExpr) getLeftOp().eval(val); - final IntLitExpr rightOpVal = (IntLitExpr) getRightOp().eval(val); - return leftOpVal.sub(rightOpVal); - } - - @Override - public SubExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return IntSubExpr.of(leftOp, rightOp); - } - } - - @Override - public SubExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } + override fun of(leftOp: Expr, rightOp: Expr): IntSubExpr = + Companion.of(leftOp, rightOp) - @Override - public SubExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final IntSubExpr that = (IntSubExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR; - } + override val operatorLabel: String get() = OPERATOR_LABEL } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntToRatExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntToRatExpr.kt index b5f58ad689..9e23e8fe17 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntToRatExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntToRatExpr.kt @@ -13,75 +13,44 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.inttype; -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; -import static hu.bme.mit.theta.core.type.rattype.RatExprs.Rat; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; +package hu.bme.mit.theta.core.type.inttype -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.CastExpr; -import hu.bme.mit.theta.core.type.rattype.RatLitExpr; -import hu.bme.mit.theta.core.type.rattype.RatType; +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.CastExpr +import hu.bme.mit.theta.core.type.inttype.IntExprs.Int +import hu.bme.mit.theta.core.type.rattype.RatLitExpr +import hu.bme.mit.theta.core.type.rattype.RatType +import hu.bme.mit.theta.core.type.rattype.RatExprs.Rat +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -public final class IntToRatExpr extends CastExpr { +@Serializable +@SerialName("IntToRat") +data class IntToRatExpr( + override val op: Expr +) : CastExpr() { - private static final int HASH_SEED = 1627; - private static final String OPERATOR_LABEL = "to_rat"; + companion object { - private IntToRatExpr(final Expr op) { - super(op); - } - - public static IntToRatExpr of(final Expr op) { - return new IntToRatExpr(op); - } - - public static IntToRatExpr create(final Expr op) { - final Expr newOp = cast(op, Int()); - return IntToRatExpr.of(newOp); - } - - @Override - public RatType getType() { - return Rat(); - } - - @Override - public RatLitExpr eval(final Valuation val) { - final IntLitExpr opVal = (IntLitExpr) getOp().eval(val); - return opVal.toRat(); - } + internal const val OPERATOR_LABEL = "to_rat" - @Override - public IntToRatExpr with(final Expr op) { - if (op == getOp()) { - return this; - } else { - return IntToRatExpr.of(op); - } - } + @JvmStatic + fun of(op: Expr) = IntToRatExpr(op) - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final IntToRatExpr that = (IntToRatExpr) obj; - return this.getOp().equals(that.getOp()); - } else { - return false; - } + @JvmStatic + fun create(op: Expr<*>) = IntToRatExpr(cast(op, Int())) } - @Override - protected int getHashSeed() { - return HASH_SEED; + override val type: RatType = Rat() + override fun eval(`val`: Valuation): RatLitExpr { + val opVal = op.eval(`val`) as IntLitExpr + return opVal.toRat() } - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } + override fun of(op: Expr): IntToRatExpr = Companion.of(op) + override val operatorLabel: String get() = OPERATOR_LABEL } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntType.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntType.kt index 9dd4ff99fd..0603f38411 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntType.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntType.kt @@ -13,140 +13,45 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.inttype; -import hu.bme.mit.theta.core.type.DomainSize; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.Type; -import hu.bme.mit.theta.core.type.abstracttype.Additive; -import hu.bme.mit.theta.core.type.abstracttype.Castable; -import hu.bme.mit.theta.core.type.abstracttype.Divisible; -import hu.bme.mit.theta.core.type.abstracttype.Equational; -import hu.bme.mit.theta.core.type.abstracttype.ModExpr; -import hu.bme.mit.theta.core.type.abstracttype.Multiplicative; -import hu.bme.mit.theta.core.type.abstracttype.Ordered; -import hu.bme.mit.theta.core.type.abstracttype.RemExpr; -import hu.bme.mit.theta.core.type.rattype.RatType; - -public final class IntType - implements Additive, - Multiplicative, - Divisible, - Equational, - Ordered, - Castable { - - private static final IntType INSTANCE = new IntType(); - private static final int HASH_SEED = 222670; - private static final String TYPE_LABEL = "Int"; - - private IntType() {} - - public static IntType getInstance() { - return INSTANCE; - } - - @Override - public int hashCode() { - return HASH_SEED; - } - - @Override - public boolean equals(final Object obj) { - return (obj != null && this.getClass() == obj.getClass()); - } - - @Override - public String toString() { - return TYPE_LABEL; - } - - //// - - @Override - public IntAddExpr Add(final Iterable> ops) { - return IntExprs.Add(ops); - } - - @Override - public IntSubExpr Sub(final Expr leftOp, final Expr rightOp) { - return IntExprs.Sub(leftOp, rightOp); - } - - @Override - public IntPosExpr Pos(final Expr op) { - return IntExprs.Pos(op); - } - - @Override - public IntNegExpr Neg(final Expr op) { - return IntExprs.Neg(op); - } - - @Override - public IntMulExpr Mul(final Iterable> ops) { - return IntExprs.Mul(ops); - } - - @Override - public IntDivExpr Div(final Expr leftOp, final Expr rightOp) { - return IntExprs.Div(leftOp, rightOp); - } - - @Override - public ModExpr Mod(Expr leftOp, Expr rightOp) { - return IntExprs.Mod(leftOp, rightOp); - } - - @Override - public RemExpr Rem(Expr leftOp, Expr rightOp) { - return IntExprs.Rem(leftOp, rightOp); - } - - @Override - public IntEqExpr Eq(final Expr leftOp, final Expr rightOp) { - return IntExprs.Eq(leftOp, rightOp); - } - - @Override - public IntNeqExpr Neq(final Expr leftOp, final Expr rightOp) { - return IntExprs.Neq(leftOp, rightOp); - } - - @Override - public IntLtExpr Lt(final Expr leftOp, final Expr rightOp) { - return IntExprs.Lt(leftOp, rightOp); - } - - @Override - public IntLeqExpr Leq(final Expr leftOp, final Expr rightOp) { - return IntExprs.Leq(leftOp, rightOp); - } - - @Override - public IntGtExpr Gt(final Expr leftOp, final Expr rightOp) { - return IntExprs.Gt(leftOp, rightOp); - } - - @Override - public IntGeqExpr Geq(final Expr leftOp, final Expr rightOp) { - return IntExprs.Geq(leftOp, rightOp); - } - - @Override - public Expr Cast( - final Expr op, final TargetType type) { - if (type instanceof RatType) { - @SuppressWarnings("unchecked") - final Expr result = (Expr) IntExprs.ToRat(op); - return result; - } else { - throw new ClassCastException("Int cannot be cast to " + type); - } - } - - @Override - public DomainSize getDomainSize() { - return DomainSize.INFINITY; - } +package hu.bme.mit.theta.core.type.inttype + +import hu.bme.mit.theta.core.type.DomainSize +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.Type +import hu.bme.mit.theta.core.type.abstracttype.* +import hu.bme.mit.theta.core.type.rattype.RatType +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName(IntType.TYPE_LABEL) +object IntType : Additive, Multiplicative, Divisible, Equational, Ordered, + Castable { + + internal const val TYPE_LABEL = "Int" + fun getInstance(): IntType = this + override fun toString(): String = TYPE_LABEL + + override fun Add(ops: Iterable>) = IntExprs.Add(ops) + override fun Sub(leftOp: Expr, rightOp: Expr) = IntExprs.Sub(leftOp, rightOp) + override fun Pos(op: Expr) = IntExprs.Pos(op) + override fun Neg(op: Expr) = IntExprs.Neg(op) + override fun Mul(ops: Iterable>) = IntExprs.Mul(ops) + override fun Div(leftOp: Expr, rightOp: Expr) = IntExprs.Div(leftOp, rightOp) + override fun Mod(leftOp: Expr, rightOp: Expr) = IntExprs.Mod(leftOp, rightOp) + override fun Rem(leftOp: Expr, rightOp: Expr) = IntExprs.Rem(leftOp, rightOp) + override fun Eq(leftOp: Expr, rightOp: Expr) = IntExprs.Eq(leftOp, rightOp) + override fun Neq(leftOp: Expr, rightOp: Expr) = IntExprs.Neq(leftOp, rightOp) + override fun Lt(leftOp: Expr, rightOp: Expr) = IntExprs.Lt(leftOp, rightOp) + override fun Leq(leftOp: Expr, rightOp: Expr) = IntExprs.Leq(leftOp, rightOp) + override fun Gt(leftOp: Expr, rightOp: Expr) = IntExprs.Gt(leftOp, rightOp) + override fun Geq(leftOp: Expr, rightOp: Expr) = IntExprs.Geq(leftOp, rightOp) + @Suppress("UNCHECKED_CAST") + override fun Cast(op: Expr, type: TargetType): Expr = + if (type is RatType) IntExprs.ToRat(op) as Expr + else throw ClassCastException("Int cannot be cast to $type") + + override val domainSize: DomainSize = DomainSize.INFINITY } + From 203b66934b5121710042732077effef4ba8b9a67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Csan=C3=A1d=20Telbisz?= Date: Fri, 20 Jun 2025 15:54:32 +0200 Subject: [PATCH 16/48] convert to serializable - jvmstatic --- .../theta/core/serialization/Serializers.kt | 38 ++++++++++++++++ .../core/type/abstracttype/AbstractExprs.kt | 26 ++++++++--- .../theta/core/type/abstracttype/CastExpr.kt | 1 + .../theta/core/type/abstracttype/DivExpr.kt | 2 - .../theta/core/type/abstracttype/EqExpr.kt | 1 - .../theta/core/type/abstracttype/GtExpr.kt | 1 - .../theta/core/type/abstracttype/LeqExpr.kt | 1 - .../theta/core/type/abstracttype/LtExpr.kt | 1 - .../theta/core/type/abstracttype/ModExpr.kt | 1 - .../theta/core/type/abstracttype/MulExpr.kt | 1 - .../theta/core/type/abstracttype/NegExpr.kt | 1 - .../theta/core/type/abstracttype/NeqExpr.kt | 1 - .../theta/core/type/abstracttype/PosExpr.kt | 1 - .../theta/core/type/abstracttype/RemExpr.kt | 1 - .../theta/core/type/abstracttype/SubExpr.kt | 1 - .../theta/core/type/anytype/Dereference.kt | 6 ++- .../bme/mit/theta/core/type/anytype/Exprs.kt | 8 +++- .../mit/theta/core/type/anytype/IteExpr.kt | 4 +- .../mit/theta/core/type/anytype/PrimeExpr.kt | 4 +- .../mit/theta/core/type/anytype/RefExpr.kt | 1 + .../mit/theta/core/type/anytype/Reference.kt | 6 +-- .../theta/core/type/arraytype/ArrayEqExpr.kt | 3 +- .../theta/core/type/arraytype/ArrayExprs.kt | 10 +++-- .../core/type/arraytype/ArrayInitExpr.kt | 9 ++-- .../theta/core/type/arraytype/ArrayLitExpr.kt | 2 +- .../theta/core/type/arraytype/ArrayNeqExpr.kt | 3 +- .../core/type/arraytype/ArrayReadExpr.kt | 3 +- .../theta/core/type/arraytype/ArrayType.kt | 3 +- .../core/type/arraytype/ArrayWriteExpr.kt | 3 +- .../mit/theta/core/type/booltype/AndExpr.kt | 7 +-- .../theta/core/type/booltype/BoolLitExpr.kt | 2 +- .../mit/theta/core/type/booltype/IffExpr.kt | 7 +-- .../mit/theta/core/type/booltype/ImplyExpr.kt | 5 ++- .../mit/theta/core/type/booltype/NotExpr.kt | 8 ++-- .../mit/theta/core/type/booltype/OrExpr.kt | 13 +++--- .../core/type/booltype/QuantifiedExpr.kt | 13 +++--- .../mit/theta/core/type/booltype/XorExpr.kt | 7 +-- .../mit/theta/core/type/inttype/IntAddExpr.kt | 2 +- .../mit/theta/core/type/inttype/IntDivExpr.kt | 2 +- .../mit/theta/core/type/inttype/IntEqExpr.kt | 2 +- .../mit/theta/core/type/inttype/IntExprs.kt | 44 ++++++++++++++++++- .../mit/theta/core/type/inttype/IntGeqExpr.kt | 2 +- .../mit/theta/core/type/inttype/IntGtExpr.kt | 2 +- .../mit/theta/core/type/inttype/IntLeqExpr.kt | 2 +- .../mit/theta/core/type/inttype/IntLtExpr.kt | 2 +- .../mit/theta/core/type/inttype/IntModExpr.kt | 2 +- .../mit/theta/core/type/inttype/IntMulExpr.kt | 2 +- .../mit/theta/core/type/inttype/IntNegExpr.kt | 2 +- .../mit/theta/core/type/inttype/IntNeqExpr.kt | 2 +- .../mit/theta/core/type/inttype/IntPosExpr.kt | 2 +- .../mit/theta/core/type/inttype/IntRemExpr.kt | 2 +- .../mit/theta/core/type/inttype/IntSubExpr.kt | 2 +- .../theta/core/type/inttype/IntToRatExpr.kt | 2 +- 53 files changed, 195 insertions(+), 84 deletions(-) create mode 100644 subprojects/common/core/src/main/java/hu/bme/mit/theta/core/serialization/Serializers.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/serialization/Serializers.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/serialization/Serializers.kt new file mode 100644 index 0000000000..08bbf452d2 --- /dev/null +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/serialization/Serializers.kt @@ -0,0 +1,38 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package hu.bme.mit.theta.core.serialization + +import kotlinx.serialization.KSerializer +import kotlinx.serialization.descriptors.PrimitiveKind +import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder +import java.math.BigInteger + +object BigIntegerSerializer : KSerializer { + + override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("BigInteger", PrimitiveKind.STRING) + + override fun serialize(encoder: Encoder, value: BigInteger) { + encoder.encodeString(value.toString()) + } + + override fun deserialize(decoder: Decoder): BigInteger { + return BigInteger(decoder.decodeString()) + } +} \ No newline at end of file diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/AbstractExprs.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/AbstractExprs.kt index e7fd46438b..d4e40051b3 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/AbstractExprs.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/AbstractExprs.kt @@ -11,8 +11,9 @@ import hu.bme.mit.theta.core.type.booltype.BoolType /** * Factory and utility methods for abstract expressions over multiple types. */ +@Suppress("FunctionName") object AbstractExprs { - + @JvmStatic // General fun Ite(cond: Expr, then: Expr<*>, elze: Expr<*>): IteExpr<*> { val newOps: Pair, Expr> = unify(then, elze) @@ -21,6 +22,7 @@ object AbstractExprs { return Exprs.Ite(cond, newThen, newElse) } + @JvmStatic // Additive fun > Add(ops: Iterable>): AddExpr { val opList = ops.toList() @@ -52,24 +54,26 @@ object AbstractExprs { private fun > getAddOps(expr: Expr): List> = if (expr is AddExpr<*>) (expr as AddExpr).ops else listOf(expr) + @JvmStatic fun > Sub(leftOp: Expr<*>, rightOp: Expr<*>): SubExpr<*> = create(leftOp, rightOp) { type: T, l, r -> type.Sub(l, r) } + @JvmStatic fun > Pos(op: Expr<*>): PosExpr<*> { val tOp: Expr = bind(op) - val type = tOp.type - return type.Pos(tOp) + return tOp.type.Pos(tOp) } + @JvmStatic fun > Neg(op: Expr<*>): NegExpr<*> { val tOp: Expr = bind(op) - val type = tOp.type - return type.Neg(tOp) + return tOp.type.Neg(tOp) } // Multiplicative + @JvmStatic fun > Mul(ops: Iterable>): MulExpr<*> { val opList = ops.toList() require(opList.isNotEmpty()) @@ -100,58 +104,69 @@ object AbstractExprs { private fun > getMulOps(expr: Expr): List> = if (expr is MulExpr<*>) (expr as MulExpr).ops else listOf(expr) + @JvmStatic fun > Div(leftOp: Expr<*>, rightOp: Expr<*>): DivExpr<*> = create(leftOp, rightOp) { type: T, l, r -> type.Div(l, r) } // Divisible + @JvmStatic fun > Mod(leftOp: Expr<*>, rightOp: Expr<*>): ModExpr<*> = create(leftOp, rightOp) { type: T, l, r -> type.Mod(l, r) } + @JvmStatic fun > Rem(leftOp: Expr<*>, rightOp: Expr<*>): RemExpr<*> = create(leftOp, rightOp) { type: T, l, r -> type.Rem(l, r) } + @JvmStatic // Equational fun > Eq(leftOp: Expr<*>, rightOp: Expr<*>): EqExpr<*> = create(leftOp, rightOp) { type: T, l, r -> type.Eq(l, r) } + @JvmStatic fun > Neq(leftOp: Expr<*>, rightOp: Expr<*>): NeqExpr<*> = create(leftOp, rightOp) { type: T, l, r -> type.Neq(l, r) } + @JvmStatic // Ordered fun > Lt(leftOp: Expr<*>, rightOp: Expr<*>): LtExpr<*> = create(leftOp, rightOp) { type: T, l, r -> type.Lt(l, r) } + @JvmStatic fun > Leq(leftOp: Expr<*>, rightOp: Expr<*>): LeqExpr<*> = create(leftOp, rightOp) { type: T, l, r -> type.Leq(l, r) } + @JvmStatic fun > Gt(leftOp: Expr<*>, rightOp: Expr<*>): GtExpr<*> = create(leftOp, rightOp) { type: T, l, r -> type.Gt(l, r) } + @JvmStatic fun > Geq(leftOp: Expr<*>, rightOp: Expr<*>): GeqExpr<*> = create(leftOp, rightOp) { type: T, l, r -> type.Geq(l, r) } // Convenience methods + @JvmStatic fun > Add(leftOp: Expr<*>, rightOp: Expr<*>): AddExpr<*> = Add(listOf(leftOp, rightOp)) + @JvmStatic fun > Mul(leftOp: Expr<*>, rightOp: Expr<*>): MulExpr<*> = Mul(listOf(leftOp, rightOp)) @@ -210,4 +225,3 @@ object AbstractExprs { private fun bind(expr1: Expr, expr2: Expr): Pair, Expr> = Pair(expr1 as Expr, expr2 as Expr) } - diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/CastExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/CastExpr.kt index 5d71a558e9..b91526d6e4 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/CastExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/CastExpr.kt @@ -25,3 +25,4 @@ import kotlinx.serialization.Serializable @Serializable abstract class CastExpr, TargetType : Type> : UnaryExpr() + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/DivExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/DivExpr.kt index 4c548351d4..7199996ac2 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/DivExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/DivExpr.kt @@ -27,5 +27,3 @@ abstract class DivExpr> : BinaryExpr> : BinaryExpr> : BinaryExpr() } } } - diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/LeqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/LeqExpr.kt index d15c44eeca..68848c02a8 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/LeqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/LeqExpr.kt @@ -26,4 +26,3 @@ abstract class LeqExpr> : BinaryExpr( } } } - diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/LtExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/LtExpr.kt index 9540ad0de8..49bdc6059c 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/LtExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/LtExpr.kt @@ -26,4 +26,3 @@ abstract class LtExpr> : BinaryExpr() } } } - diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/ModExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/ModExpr.kt index 0e3ceec6f1..f070ffcdd6 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/ModExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/ModExpr.kt @@ -25,4 +25,3 @@ abstract class ModExpr> : BinaryExpr> : MultiaryExpr> : UnaryExpr> : BinaryExpr> : UnaryExpr> : BinaryExpr> : BinaryExpr( val array: Expr, val offset: Expr, @@ -46,14 +46,16 @@ data class Dereference( companion object { - internal const val OPERATOR_LABEL = "deref" + private const val OPERATOR_LABEL = "deref" + @JvmStatic fun of( array: Expr, offset: Expr, type: T ): Dereference = Dereference(array, offset, type) + @JvmStatic private fun of( array: Expr, offset: Expr, diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/Exprs.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/Exprs.kt index 68c58f7389..5a27bf70a3 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/Exprs.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/Exprs.kt @@ -23,10 +23,13 @@ import hu.bme.mit.theta.core.type.booltype.BoolType /** * Factory and utility methods for any-type expressions. */ +@Suppress("FunctionName") object Exprs { + @JvmStatic fun Ref(decl: Decl): RefExpr = RefExpr(decl) + @JvmStatic fun Ite( cond: Expr, then: Expr, @@ -34,9 +37,11 @@ object Exprs { ): IteExpr = IteExpr(cond, then, elze) + @JvmStatic fun Prime(op: Expr): PrimeExpr = PrimeExpr(op) + @JvmStatic fun Dereference( arr: Expr, offset: Expr, @@ -44,6 +49,7 @@ object Exprs { ): Dereference = Dereference(arr, offset, type) + @JvmStatic fun Reference( expr: Expr, type: ArrType @@ -51,6 +57,7 @@ object Exprs { Reference(expr, type) // Convenience methods + @JvmStatic fun Prime(op: Expr, i: Int): Expr { require(i >= 0) return when (i) { @@ -60,4 +67,3 @@ object Exprs { } } } - diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/IteExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/IteExpr.kt index 9143fe6f99..07228ae402 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/IteExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/IteExpr.kt @@ -33,7 +33,7 @@ import kotlinx.serialization.Serializable * @param ExprType The type of the expression */ @Serializable -@SerialName(IteExpr.OPERATOR_LABEL) +@SerialName("Ite") data class IteExpr( val cond: Expr, val then: Expr, @@ -42,7 +42,7 @@ data class IteExpr( companion object { - internal const val OPERATOR_LABEL = "ite" + private const val OPERATOR_LABEL = "ite" @JvmStatic fun of( diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/PrimeExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/PrimeExpr.kt index 758d612b68..bfa1a0dfcb 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/PrimeExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/PrimeExpr.kt @@ -29,7 +29,7 @@ import kotlinx.serialization.Serializable * @param ExprType The type of the expression */ @Serializable -@SerialName(PrimeExpr.OPERATOR_LABEL) +@SerialName("Prime") data class PrimeExpr( override val op: Expr ) : UnaryExpr() { @@ -37,7 +37,7 @@ data class PrimeExpr( companion object { internal const val OPERATOR_LABEL = "prime" - + @JvmStatic fun of(op: Expr): PrimeExpr = PrimeExpr(op) } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/RefExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/RefExpr.kt index e8d1519aee..1d5c8cbb5c 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/RefExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/RefExpr.kt @@ -36,6 +36,7 @@ data class RefExpr( companion object { + @JvmStatic fun of(decl: Decl): RefExpr = RefExpr(decl) } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/Reference.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/Reference.kt index f6185453b9..66eae08bff 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/Reference.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/Reference.kt @@ -33,15 +33,15 @@ import kotlinx.serialization.Serializable * @property type The type of the reference */ @Serializable -@SerialName(Reference.OPERATOR_LABEL) +@SerialName("Reference") data class Reference( val expr: Expr, override val type: A ) : Expr { companion object { - internal const val OPERATOR_LABEL = "ref" - + private const val OPERATOR_LABEL = "ref" + @JvmStatic fun of(expr: Expr, type: A): Reference = Reference(expr, type) } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayEqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayEqExpr.kt index 76889aeed1..d39ac41bf1 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayEqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayEqExpr.kt @@ -27,11 +27,13 @@ data class ArrayEqExpr( private const val OPERATOR_LABEL = "=" + @JvmStatic fun of( leftOp: Expr>, rightOp: Expr> ) = ArrayEqExpr(leftOp, rightOp) + @JvmStatic fun create( leftOp: Expr<*>, rightOp: Expr<*> ): ArrayEqExpr<*, *> { @@ -64,4 +66,3 @@ data class ArrayEqExpr( .toString() } } - diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayExprs.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayExprs.kt index 3cf0126b6e..6870b5b5d6 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayExprs.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayExprs.kt @@ -7,15 +7,15 @@ import kotlinx.serialization.Serializable /** * Factory and utility methods for array-type expressions. */ -@Serializable object ArrayExprs { - + @JvmStatic fun Array( indexType: IndexType, elemType: ElemType ): ArrayType = ArrayType(indexType, elemType) + @JvmStatic fun Array( elements: List, Expr>>, elseElem: Expr, @@ -23,6 +23,7 @@ object ArrayExprs { ): ArrayLitExpr = ArrayLitExpr.of(elements, elseElem, type) + @JvmStatic fun ArrayInit( elements: List, Expr>>, elseElem: Expr, @@ -30,12 +31,14 @@ object ArrayExprs { ): ArrayInitExpr = ArrayInitExpr(elements, elseElem, type) + @JvmStatic fun Read( array: Expr>, index: Expr ): ArrayReadExpr = ArrayReadExpr(array, index) + @JvmStatic fun Write( array: Expr>, index: Expr, @@ -43,16 +46,17 @@ object ArrayExprs { ): ArrayWriteExpr = ArrayWriteExpr(array, index, elem) + @JvmStatic fun Eq( leftOp: Expr>, rightOp: Expr> ): ArrayEqExpr = ArrayEqExpr(leftOp, rightOp) + @JvmStatic fun Neq( leftOp: Expr>, rightOp: Expr> ): ArrayNeqExpr = ArrayNeqExpr(leftOp, rightOp) } - diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayInitExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayInitExpr.kt index 4f8f286a1b..e0818fa5f0 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayInitExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayInitExpr.kt @@ -17,7 +17,7 @@ import kotlinx.serialization.Serializable * elements. */ @Serializable -@SerialName(ArrayInitExpr.OPERATOR_LABEL) +@SerialName("ArrayInit") data class ArrayInitExpr( val elements: List, Expr>>, val elseElem: Expr, @@ -32,14 +32,16 @@ data class ArrayInitExpr( companion object { - internal const val OPERATOR_LABEL = "arrayinit" + private const val OPERATOR_LABEL = "arrayinit" + @JvmStatic fun of( elems: List, Expr>>, elseElem: Expr, type: ArrayType ) = ArrayInitExpr(elems, elseElem, type) + @JvmStatic @Suppress("UNCHECKED_CAST") fun create( elems: List, Expr>>, @@ -80,6 +82,8 @@ data class ArrayInitExpr( return of(newOps, elseElem, type) } + override fun of(ops: List>): MultiaryExpr> = with(ops) + @Suppress("UNCHECKED_CAST") override fun withOps(ops: List>): MultiaryExpr> = with(ops.map { it as Expr }) @@ -89,4 +93,3 @@ data class ArrayInitExpr( override fun toString(): String = "arrayinit($elements, $elseElem, $type)" } - diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayLitExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayLitExpr.kt index f2a8991955..108b0a07c5 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayLitExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayLitExpr.kt @@ -26,6 +26,7 @@ data class ArrayLitExpr private constructor( private const val OPERATOR_LABEL = "array" + @JvmStatic fun of( elems: List, Expr>>, elseElem: Expr, @@ -54,4 +55,3 @@ data class ArrayLitExpr private constructor( .add("(default $elseElem)") .toString() } - diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayNeqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayNeqExpr.kt index 65a41c8422..e3360a2a26 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayNeqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayNeqExpr.kt @@ -26,11 +26,12 @@ data class ArrayNeqExpr( companion object { private const val OPERATOR_LABEL = "/=" + @JvmStatic fun of( leftOp: Expr>, rightOp: Expr> ) = ArrayNeqExpr(leftOp, rightOp) - + @JvmStatic fun create( leftOp: Expr<*>, rightOp: Expr<*> ): ArrayNeqExpr<*, *> { diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayReadExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayReadExpr.kt index 23ec8ca417..77b7d05c60 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayReadExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayReadExpr.kt @@ -23,11 +23,13 @@ data class ArrayReadExpr( private const val OPERATOR_LABEL = "read" + @JvmStatic fun of( array: Expr>, index: Expr ) = ArrayReadExpr(array, index) + @JvmStatic @Suppress("UNCHECKED_CAST") fun create( array: Expr<*>, @@ -79,4 +81,3 @@ data class ArrayReadExpr( override fun toString(): String = Utils.lispStringBuilder(OPERATOR_LABEL).body().add(array).add(index).toString() } - diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayType.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayType.kt index 24bcea1218..7b6c3a69aa 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayType.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayType.kt @@ -23,7 +23,7 @@ data class ArrayType( companion object { internal const val TYPE_LABEL = "Array" - + @JvmStatic fun of( indexType: IndexType, elemType: ElemType ): ArrayType = @@ -46,4 +46,3 @@ data class ArrayType( override val domainSize: DomainSize get() = DomainSize.pow(elemType.domainSize, indexType.domainSize) } - diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayWriteExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayWriteExpr.kt index 6ee889f353..f237726b68 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayWriteExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayWriteExpr.kt @@ -24,12 +24,14 @@ data class ArrayWriteExpr( private const val OPERATOR_LABEL = "write" + @JvmStatic fun of( array: Expr>, index: Expr, elem: Expr ) = ArrayWriteExpr(array, index, elem) + @JvmStatic @Suppress("UNCHECKED_CAST") fun create( array: Expr<*>, @@ -81,4 +83,3 @@ data class ArrayWriteExpr( fun withIndex(index: Expr): ArrayWriteExpr = with(array, index, elem) fun withElem(elem: Expr): ArrayWriteExpr = with(array, index, elem) } - diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/AndExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/AndExpr.kt index 76d8867730..1de3e585e4 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/AndExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/AndExpr.kt @@ -15,15 +15,17 @@ import kotlinx.serialization.Serializable * Logical AND expression for boolean type. */ @Serializable -@SerialName(AndExpr.OPERATOR_LABEL) +@SerialName("And") data class AndExpr( override val ops: List> ) : MultiaryExpr() { companion object { - internal const val OPERATOR_LABEL = "and" + private const val OPERATOR_LABEL = "and" + @JvmStatic fun of(ops: Iterable>) = AndExpr(ops.toList()) + @JvmStatic fun create(ops: List>) = AndExpr(ops.map { cast(it, Bool()) }) } @@ -37,4 +39,3 @@ data class AndExpr( override fun toString(): String = Utils.lispStringBuilder(OPERATOR_LABEL).add(ops).toString() override val operatorLabel: String get() = OPERATOR_LABEL } - diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/BoolLitExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/BoolLitExpr.kt index 49fe919202..b9ccb217c1 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/BoolLitExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/BoolLitExpr.kt @@ -20,7 +20,7 @@ sealed class BoolLitExpr : NullaryExpr(), LitExpr { override fun eval(`val`: Valuation): BoolLitExpr = this companion object { - + @JvmStatic fun of(value: Boolean): BoolLitExpr = if (value) TrueExpr else FalseExpr } } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/IffExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/IffExpr.kt index 1d141c531a..0bd99a92da 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/IffExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/IffExpr.kt @@ -13,7 +13,7 @@ import kotlinx.serialization.Serializable * Logical IFF (if and only if) expression for boolean type. */ @Serializable -@SerialName(IffExpr.OPERATOR_LABEL) +@SerialName("Iff") data class IffExpr( override val leftOp: Expr, override val rightOp: Expr @@ -21,8 +21,10 @@ data class IffExpr( companion object { - internal const val OPERATOR_LABEL = "iff" + private const val OPERATOR_LABEL = "iff" + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = IffExpr(leftOp, rightOp) + @JvmStatic fun create(leftOp: Expr<*>, rightOp: Expr<*>) = IffExpr(cast(leftOp, Bool()), cast(rightOp, Bool())) } @@ -36,4 +38,3 @@ data class IffExpr( override fun toString(): String = Utils.lispStringBuilder(OPERATOR_LABEL).add(leftOp).add(rightOp).toString() override val operatorLabel: String get() = OPERATOR_LABEL } - diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/ImplyExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/ImplyExpr.kt index 0c7afbb82e..11c070bfa3 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/ImplyExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/ImplyExpr.kt @@ -19,8 +19,10 @@ data class ImplyExpr( override val rightOp: Expr ) : BinaryExpr() { companion object { - internal const val OPERATOR_LABEL = "=>" + private const val OPERATOR_LABEL = "=>" + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = ImplyExpr(leftOp, rightOp) + @JvmStatic fun create(leftOp: Expr<*>, rightOp: Expr<*>) = ImplyExpr(cast(leftOp, Bool()), cast(rightOp, Bool())) } override val type: BoolType = Bool() @@ -31,4 +33,3 @@ data class ImplyExpr( override fun toString(): String = Utils.lispStringBuilder(OPERATOR_LABEL).add(leftOp).add(rightOp).toString() override val operatorLabel: String get() = OPERATOR_LABEL } - diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/NotExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/NotExpr.kt index 4bf9a3091b..6c25e13abb 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/NotExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/NotExpr.kt @@ -13,15 +13,18 @@ import kotlinx.serialization.Serializable * Logical NOT expression for boolean type. */ @Serializable -@SerialName(NotExpr.OPERATOR_LABEL) +@SerialName("Not") data class NotExpr( override val op: Expr ) : UnaryExpr() { companion object { - internal const val OPERATOR_LABEL = "not" + private const val OPERATOR_LABEL = "not" + + @JvmStatic fun of(op: Expr) = NotExpr(op) + @JvmStatic fun create(op: Expr<*>) = NotExpr(cast(op, Bool())) } @@ -31,4 +34,3 @@ data class NotExpr( override fun toString(): String = Utils.lispStringBuilder(OPERATOR_LABEL).add(op).toString() override val operatorLabel: String = OPERATOR_LABEL } - diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/OrExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/OrExpr.kt index d0431a0dda..116933e549 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/OrExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/OrExpr.kt @@ -15,15 +15,19 @@ import kotlinx.serialization.Serializable * Logical OR expression for boolean type. */ @Serializable -@SerialName(OrExpr.OPERATOR_LABEL) +@SerialName("Or") data class OrExpr( override val ops: List> ) : MultiaryExpr() { companion object { - internal const val OPERATOR_LABEL = "or" + private const val OPERATOR_LABEL = "or" + + @JvmStatic fun of(ops: Iterable>) = OrExpr(ops.toList()) + + @JvmStatic fun create(ops: List>) = OrExpr(ops.map { cast(it, Bool()) }) } @@ -31,10 +35,9 @@ data class OrExpr( override fun eval(`val`: Valuation): BoolLitExpr = if (ops.any { (it.eval(`val`) as BoolLitExpr).value }) True() else False() - override fun with(ops: Iterable>): OrExpr = - if (ops.toList() == this.ops) this else OrExpr(ops.toList()) + override fun of(ops: List>): OrExpr = + Companion.of(ops) override fun toString(): String = Utils.lispStringBuilder(OPERATOR_LABEL).add(ops).toString() override val operatorLabel: String get() = OPERATOR_LABEL } - diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/QuantifiedExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/QuantifiedExpr.kt index d142c6b90d..be6aececfc 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/QuantifiedExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/QuantifiedExpr.kt @@ -41,7 +41,7 @@ sealed class QuantifiedExpr : Expr { * Existential quantifier expression for boolean type. */ @Serializable -@SerialName(ExistsExpr.OPERATOR_LABEL) +@SerialName("Exists") data class ExistsExpr( override val paramDecls: List>, override val op: Expr @@ -49,10 +49,12 @@ data class ExistsExpr( companion object { - internal const val OPERATOR_LABEL = "exists" + private const val OPERATOR_LABEL = "exists" + @JvmStatic fun of(paramDecls: Iterable>, op: Expr) = ExistsExpr(paramDecls.toList(), op) + @JvmStatic fun create(paramDecls: Iterable>, op: Expr<*>) = ExistsExpr(paramDecls.toList(), cast(op, Bool())) } @@ -67,7 +69,7 @@ data class ExistsExpr( * Universal quantifier expression for boolean type. */ @Serializable -@SerialName(ForallExpr.OPERATOR_LABEL) +@SerialName("Forall") data class ForallExpr( override val paramDecls: List>, override val op: Expr @@ -75,10 +77,12 @@ data class ForallExpr( companion object { - internal const val OPERATOR_LABEL = "forall" + private const val OPERATOR_LABEL = "forall" + @JvmStatic fun of(paramDecls: Iterable>, op: Expr) = ForallExpr(paramDecls.toList(), op) + @JvmStatic fun create(paramDecls: Iterable>, op: Expr<*>) = ForallExpr(paramDecls.toList(), cast(op, Bool())) } @@ -88,4 +92,3 @@ data class ForallExpr( override val operatorLabel: String = OPERATOR_LABEL } - diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/XorExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/XorExpr.kt index 59804532a9..a8763ea12a 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/XorExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/XorExpr.kt @@ -13,7 +13,7 @@ import kotlinx.serialization.Serializable * Logical XOR expression for boolean type. */ @Serializable -@SerialName(XorExpr.OPERATOR_LABEL) +@SerialName("Xor") data class XorExpr( override val leftOp: Expr, override val rightOp: Expr @@ -21,8 +21,10 @@ data class XorExpr( companion object { - internal const val OPERATOR_LABEL = "xor" + private const val OPERATOR_LABEL = "xor" + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = XorExpr(leftOp, rightOp) + @JvmStatic fun create(leftOp: Expr<*>, rightOp: Expr<*>) = XorExpr(cast(leftOp, Bool()), cast(rightOp, Bool())) } @@ -36,4 +38,3 @@ data class XorExpr( override fun toString(): String = Utils.lispStringBuilder(OPERATOR_LABEL).add(leftOp).add(rightOp).toString() override val operatorLabel: String get() = OPERATOR_LABEL } - diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntAddExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntAddExpr.kt index 8b8d7976fa..f477f56c7e 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntAddExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntAddExpr.kt @@ -33,7 +33,7 @@ data class IntAddExpr( companion object { - internal const val OPERATOR_LABEL = "+" + private const val OPERATOR_LABEL = "+" @JvmStatic fun of(ops: Iterable>) = IntAddExpr(ops.toList()) diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntDivExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntDivExpr.kt index c1e4755085..87b464c009 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntDivExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntDivExpr.kt @@ -33,7 +33,7 @@ data class IntDivExpr( companion object { - internal const val OPERATOR_LABEL = "div" + private const val OPERATOR_LABEL = "div" @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = IntDivExpr(leftOp, rightOp) @JvmStatic diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntEqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntEqExpr.kt index 20d97a5ed1..b8d63c64e2 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntEqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntEqExpr.kt @@ -36,7 +36,7 @@ data class IntEqExpr( companion object { - internal const val OPERATOR_LABEL = "=" + private const val OPERATOR_LABEL = "=" @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = IntEqExpr(leftOp, rightOp) @JvmStatic diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntExprs.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntExprs.kt index 42f2cf2b64..c1d561b8a8 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntExprs.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntExprs.kt @@ -24,26 +24,66 @@ import java.math.BigInteger */ @Suppress("FunctionName") object IntExprs { + @JvmStatic fun Int() = IntType + + @JvmStatic fun Int(value: Int) = IntLitExpr(BigInteger.valueOf(value.toLong())) + + @JvmStatic fun Int(value: String) = IntLitExpr(BigInteger(value)) + + @JvmStatic fun Int(value: BigInteger) = IntLitExpr(value) + + @JvmStatic fun ToRat(op: Expr) = IntToRatExpr(op) + + @JvmStatic fun Add(ops: Iterable>) = IntAddExpr.of(ops) + + @JvmStatic fun Add(vararg ops: Expr) = IntAddExpr(ops.asList()) + + @JvmStatic fun Sub(leftOp: Expr, rightOp: Expr) = IntSubExpr(leftOp, rightOp) + + @JvmStatic fun Pos(op: Expr) = IntPosExpr(op) + + @JvmStatic fun Neg(op: Expr) = IntNegExpr(op) + + @JvmStatic fun Mul(ops: Iterable>) = IntMulExpr.of(ops) + + @JvmStatic fun Mul(vararg ops: Expr) = IntMulExpr(ops.asList()) + + @JvmStatic fun Div(leftOp: Expr, rightOp: Expr) = IntDivExpr(leftOp, rightOp) + + @JvmStatic fun Mod(leftOp: Expr, rightOp: Expr) = IntModExpr(leftOp, rightOp) + + @JvmStatic fun Rem(leftOp: Expr, rightOp: Expr) = IntRemExpr(leftOp, rightOp) + + @JvmStatic fun Eq(leftOp: Expr, rightOp: Expr) = IntEqExpr(leftOp, rightOp) + + @JvmStatic fun Neq(leftOp: Expr, rightOp: Expr) = IntNeqExpr(leftOp, rightOp) + + @JvmStatic fun Lt(leftOp: Expr, rightOp: Expr) = IntLtExpr(leftOp, rightOp) + + @JvmStatic fun Leq(leftOp: Expr, rightOp: Expr) = IntLeqExpr(leftOp, rightOp) + + @JvmStatic fun Gt(leftOp: Expr, rightOp: Expr) = IntGtExpr(leftOp, rightOp) - fun Geq(leftOp: Expr, rightOp: Expr) = IntGeqExpr(leftOp, rightOp) -} + @JvmStatic + fun Geq(leftOp: Expr, rightOp: Expr) = IntGeqExpr(leftOp, rightOp) +} \ No newline at end of file diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntGeqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntGeqExpr.kt index ed93957d3a..05b42ccc99 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntGeqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntGeqExpr.kt @@ -36,7 +36,7 @@ data class IntGeqExpr( companion object { - internal const val OPERATOR_LABEL = ">=" + private const val OPERATOR_LABEL = ">=" @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = IntGeqExpr(leftOp, rightOp) @JvmStatic diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntGtExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntGtExpr.kt index 49b9a4e924..6aa7475d73 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntGtExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntGtExpr.kt @@ -36,7 +36,7 @@ data class IntGtExpr( companion object { - internal const val OPERATOR_LABEL = ">" + private const val OPERATOR_LABEL = ">" @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = IntGtExpr(leftOp, rightOp) @JvmStatic diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLeqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLeqExpr.kt index 5e35e87b27..f47ea158c0 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLeqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLeqExpr.kt @@ -36,7 +36,7 @@ data class IntLeqExpr( companion object { - internal const val OPERATOR_LABEL = "<=" + private const val OPERATOR_LABEL = "<=" @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = IntLeqExpr(leftOp, rightOp) @JvmStatic diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLtExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLtExpr.kt index 4981a282b6..4e59c1b8b8 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLtExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLtExpr.kt @@ -36,7 +36,7 @@ data class IntLtExpr( companion object { - internal const val OPERATOR_LABEL = "<" + private const val OPERATOR_LABEL = "<" @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = IntLtExpr(leftOp, rightOp) @JvmStatic diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntModExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntModExpr.kt index f52a7dd855..5f99a5fc3c 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntModExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntModExpr.kt @@ -33,7 +33,7 @@ data class IntModExpr( companion object { - internal const val OPERATOR_LABEL = "mod" + private const val OPERATOR_LABEL = "mod" @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = IntModExpr(leftOp, rightOp) @JvmStatic diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntMulExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntMulExpr.kt index 9047bd30c2..c60cc206b2 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntMulExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntMulExpr.kt @@ -33,7 +33,7 @@ data class IntMulExpr( companion object { - internal const val OPERATOR_LABEL = "*" + private const val OPERATOR_LABEL = "*" @JvmStatic fun of(ops: Iterable>) = IntMulExpr(ops.toList()) @JvmStatic diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntNegExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntNegExpr.kt index c33725e6d7..9d6c825fd0 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntNegExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntNegExpr.kt @@ -32,7 +32,7 @@ data class IntNegExpr( companion object { - internal const val OPERATOR_LABEL = "-" + private const val OPERATOR_LABEL = "-" @JvmStatic fun of(op: Expr) = IntNegExpr(op) @JvmStatic diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntNeqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntNeqExpr.kt index 33d74da3ff..dd7d03209f 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntNeqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntNeqExpr.kt @@ -36,7 +36,7 @@ data class IntNeqExpr( companion object { - internal const val OPERATOR_LABEL = "/=" + private const val OPERATOR_LABEL = "/=" @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = IntNeqExpr(leftOp, rightOp) @JvmStatic diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntPosExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntPosExpr.kt index bddf596591..1fb314f9a7 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntPosExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntPosExpr.kt @@ -32,7 +32,7 @@ data class IntPosExpr( companion object { - internal const val OPERATOR_LABEL = "+" + private const val OPERATOR_LABEL = "+" @JvmStatic fun of(op: Expr) = IntPosExpr(op) @JvmStatic diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntRemExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntRemExpr.kt index e4a2287304..da11de40e9 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntRemExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntRemExpr.kt @@ -33,7 +33,7 @@ data class IntRemExpr( companion object { - internal const val OPERATOR_LABEL = "rem" + private const val OPERATOR_LABEL = "rem" @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = IntRemExpr(leftOp, rightOp) @JvmStatic diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntSubExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntSubExpr.kt index d244fd87b3..08745ed4ff 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntSubExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntSubExpr.kt @@ -33,7 +33,7 @@ data class IntSubExpr( companion object { - internal const val OPERATOR_LABEL = "-" + private const val OPERATOR_LABEL = "-" @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = IntSubExpr(leftOp, rightOp) @JvmStatic diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntToRatExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntToRatExpr.kt index 9e23e8fe17..c97d4a2737 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntToRatExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntToRatExpr.kt @@ -35,7 +35,7 @@ data class IntToRatExpr( companion object { - internal const val OPERATOR_LABEL = "to_rat" + private const val OPERATOR_LABEL = "to_rat" @JvmStatic fun of(op: Expr) = IntToRatExpr(op) From 023919a594adae9f8dfb95cd29578822099cab02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Csan=C3=A1d=20Telbisz?= Date: Fri, 20 Jun 2025 17:12:42 +0200 Subject: [PATCH 17/48] Rename .java to .kt --- .../theta/core/type/rattype/{RatAddExpr.java => RatAddExpr.kt} | 0 .../theta/core/type/rattype/{RatDivExpr.java => RatDivExpr.kt} | 0 .../mit/theta/core/type/rattype/{RatEqExpr.java => RatEqExpr.kt} | 0 .../mit/theta/core/type/rattype/{RatExprs.java => RatExprs.kt} | 0 .../theta/core/type/rattype/{RatGeqExpr.java => RatGeqExpr.kt} | 0 .../mit/theta/core/type/rattype/{RatGtExpr.java => RatGtExpr.kt} | 0 .../theta/core/type/rattype/{RatLeqExpr.java => RatLeqExpr.kt} | 0 .../theta/core/type/rattype/{RatLitExpr.java => RatLitExpr.kt} | 0 .../mit/theta/core/type/rattype/{RatLtExpr.java => RatLtExpr.kt} | 0 .../theta/core/type/rattype/{RatMulExpr.java => RatMulExpr.kt} | 0 .../theta/core/type/rattype/{RatNegExpr.java => RatNegExpr.kt} | 0 .../theta/core/type/rattype/{RatNeqExpr.java => RatNeqExpr.kt} | 0 .../theta/core/type/rattype/{RatPosExpr.java => RatPosExpr.kt} | 0 .../theta/core/type/rattype/{RatSubExpr.java => RatSubExpr.kt} | 0 .../core/type/rattype/{RatToIntExpr.java => RatToIntExpr.kt} | 0 .../bme/mit/theta/core/type/rattype/{RatType.java => RatType.kt} | 0 16 files changed, 0 insertions(+), 0 deletions(-) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/{RatAddExpr.java => RatAddExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/{RatDivExpr.java => RatDivExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/{RatEqExpr.java => RatEqExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/{RatExprs.java => RatExprs.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/{RatGeqExpr.java => RatGeqExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/{RatGtExpr.java => RatGtExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/{RatLeqExpr.java => RatLeqExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/{RatLitExpr.java => RatLitExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/{RatLtExpr.java => RatLtExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/{RatMulExpr.java => RatMulExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/{RatNegExpr.java => RatNegExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/{RatNeqExpr.java => RatNeqExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/{RatPosExpr.java => RatPosExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/{RatSubExpr.java => RatSubExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/{RatToIntExpr.java => RatToIntExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/{RatType.java => RatType.kt} (100%) diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatAddExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatAddExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatAddExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatAddExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatDivExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatDivExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatDivExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatDivExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatEqExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatEqExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatEqExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatEqExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatExprs.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatExprs.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatExprs.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatExprs.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatGeqExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatGeqExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatGeqExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatGeqExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatGtExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatGtExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatGtExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatGtExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatLeqExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatLeqExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatLeqExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatLeqExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatLitExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatLitExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatLitExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatLitExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatLtExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatLtExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatLtExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatLtExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatMulExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatMulExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatMulExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatMulExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatNegExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatNegExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatNegExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatNegExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatNeqExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatNeqExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatNeqExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatNeqExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatPosExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatPosExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatPosExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatPosExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatSubExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatSubExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatSubExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatSubExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatToIntExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatToIntExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatToIntExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatToIntExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatType.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatType.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatType.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatType.kt From 0377b0aa6d1566363c229d10882c5b48488a8a9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Csan=C3=A1d=20Telbisz?= Date: Fri, 20 Jun 2025 17:12:44 +0200 Subject: [PATCH 18/48] rattype --- .../hu/bme/mit/theta/core/type/BinaryExpr.kt | 6 +- .../theta/core/type/abstracttype/EqExpr.kt | 7 + .../theta/core/type/abstracttype/GeqExpr.kt | 6 + .../theta/core/type/abstracttype/GtExpr.kt | 7 + .../theta/core/type/abstracttype/LeqExpr.kt | 6 + .../theta/core/type/abstracttype/LtExpr.kt | 7 + .../theta/core/type/abstracttype/NeqExpr.kt | 10 +- .../theta/core/type/arraytype/ArrayEqExpr.kt | 18 +- .../theta/core/type/arraytype/ArrayNeqExpr.kt | 18 +- .../mit/theta/core/type/booltype/IffExpr.kt | 10 +- .../mit/theta/core/type/booltype/XorExpr.kt | 9 +- .../theta/core/type/enumtype/EnumEqExpr.kt | 12 +- .../theta/core/type/enumtype/EnumNeqExpr.kt | 10 +- .../mit/theta/core/type/inttype/IntEqExpr.kt | 7 +- .../mit/theta/core/type/inttype/IntGeqExpr.kt | 7 +- .../mit/theta/core/type/inttype/IntGtExpr.kt | 6 +- .../mit/theta/core/type/inttype/IntLeqExpr.kt | 7 +- .../mit/theta/core/type/inttype/IntLtExpr.kt | 8 +- .../mit/theta/core/type/inttype/IntNeqExpr.kt | 6 +- .../mit/theta/core/type/rattype/RatAddExpr.kt | 103 +++---- .../mit/theta/core/type/rattype/RatDivExpr.kt | 138 +++------ .../mit/theta/core/type/rattype/RatEqExpr.kt | 101 ++----- .../mit/theta/core/type/rattype/RatExprs.kt | 218 ++++---------- .../mit/theta/core/type/rattype/RatGeqExpr.kt | 101 ++----- .../mit/theta/core/type/rattype/RatGtExpr.kt | 101 ++----- .../mit/theta/core/type/rattype/RatLeqExpr.kt | 103 ++----- .../mit/theta/core/type/rattype/RatLitExpr.kt | 265 +++++------------- .../mit/theta/core/type/rattype/RatLtExpr.kt | 101 ++----- .../mit/theta/core/type/rattype/RatMulExpr.kt | 96 +++---- .../mit/theta/core/type/rattype/RatNegExpr.kt | 86 ++---- .../mit/theta/core/type/rattype/RatNeqExpr.kt | 101 ++----- .../mit/theta/core/type/rattype/RatPosExpr.kt | 86 ++---- .../mit/theta/core/type/rattype/RatSubExpr.kt | 101 ++----- .../theta/core/type/rattype/RatToIntExpr.kt | 90 ++---- .../mit/theta/core/type/rattype/RatType.kt | 154 +++------- 35 files changed, 629 insertions(+), 1483 deletions(-) diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/BinaryExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/BinaryExpr.kt index b39971cc65..44f88ecd44 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/BinaryExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/BinaryExpr.kt @@ -56,9 +56,5 @@ abstract class BinaryExpr : Expr { open fun withRightOp(rightOp: Expr): BinaryExpr = with(leftOp, rightOp) - override fun toString(): String = Utils.lispStringBuilder(operatorLabel) - .body() - .add(leftOp) - .add(rightOp) - .toString() + override fun toString(): String = Utils.lispStringBuilder(operatorLabel).add(leftOp).add(rightOp).toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/EqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/EqExpr.kt index 8a76042bf3..7c8d62c545 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/EqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/EqExpr.kt @@ -2,6 +2,7 @@ package hu.bme.mit.theta.core.type.abstracttype import hu.bme.mit.theta.core.type.BinaryExpr import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool import hu.bme.mit.theta.core.type.booltype.BoolType import hu.bme.mit.theta.core.utils.TypeUtils.cast import kotlinx.serialization.Serializable @@ -11,6 +12,8 @@ abstract class EqExpr> : BinaryExpr> create2( leftOp: Expr<*>, @@ -23,4 +26,8 @@ abstract class EqExpr> : BinaryExpr> : BinaryExpr() { companion object { + private const val OPERATOR_LABEL = ">=" @JvmStatic fun > create2( @@ -26,4 +28,8 @@ abstract class GeqExpr> : BinaryExpr( return type.Geq(newLeftOp, newRightOp) } } + + override val type: BoolType = Bool() + + override val operatorLabel: String get() = OPERATOR_LABEL } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/GtExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/GtExpr.kt index b470c4841a..b459ba55d9 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/GtExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/GtExpr.kt @@ -2,6 +2,7 @@ package hu.bme.mit.theta.core.type.abstracttype import hu.bme.mit.theta.core.type.BinaryExpr import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool import hu.bme.mit.theta.core.type.booltype.BoolType import hu.bme.mit.theta.core.utils.TypeUtils.cast import kotlinx.serialization.Serializable @@ -14,6 +15,8 @@ import kotlinx.serialization.Serializable abstract class GtExpr> : BinaryExpr() { companion object { + private const val OPERATOR_LABEL = ">" + @JvmStatic fun > create2( leftOp: Expr<*>, @@ -26,4 +29,8 @@ abstract class GtExpr> : BinaryExpr() return type.Gt(newLeftOp, newRightOp) } } + + override val type: BoolType = Bool() + + override val operatorLabel: String get() = OPERATOR_LABEL } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/LeqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/LeqExpr.kt index 68848c02a8..741bceac0b 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/LeqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/LeqExpr.kt @@ -2,6 +2,7 @@ package hu.bme.mit.theta.core.type.abstracttype import hu.bme.mit.theta.core.type.BinaryExpr import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool import hu.bme.mit.theta.core.type.booltype.BoolType import hu.bme.mit.theta.core.utils.TypeUtils.cast import kotlinx.serialization.Serializable @@ -13,6 +14,7 @@ import kotlinx.serialization.Serializable abstract class LeqExpr> : BinaryExpr() { companion object { + private const val OPERATOR_LABEL = "<=" @JvmStatic fun > create2( leftOp: Expr<*>, @@ -25,4 +27,8 @@ abstract class LeqExpr> : BinaryExpr( return type.Leq(newLeftOp, newRightOp) } } + + override val type: BoolType = Bool() + + override val operatorLabel: String get() = OPERATOR_LABEL } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/LtExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/LtExpr.kt index 49bdc6059c..77f80b4d65 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/LtExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/LtExpr.kt @@ -2,6 +2,7 @@ package hu.bme.mit.theta.core.type.abstracttype import hu.bme.mit.theta.core.type.BinaryExpr import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool import hu.bme.mit.theta.core.type.booltype.BoolType import hu.bme.mit.theta.core.utils.TypeUtils.cast import kotlinx.serialization.Serializable @@ -13,6 +14,8 @@ import kotlinx.serialization.Serializable abstract class LtExpr> : BinaryExpr() { companion object { + private const val OPERATOR_LABEL = "<" + @JvmStatic fun > create2( leftOp: Expr<*>, @@ -25,4 +28,8 @@ abstract class LtExpr> : BinaryExpr() return type.Lt(newLeftOp, newRightOp) } } + + override val operatorLabel: String get() = OPERATOR_LABEL + + override val type: BoolType = Bool() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/NeqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/NeqExpr.kt index 8ea0032136..5225963835 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/NeqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/NeqExpr.kt @@ -2,6 +2,8 @@ package hu.bme.mit.theta.core.type.abstracttype import hu.bme.mit.theta.core.type.BinaryExpr import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool +import hu.bme.mit.theta.core.type.booltype.BoolType import hu.bme.mit.theta.core.utils.TypeUtils.cast import kotlinx.serialization.Serializable @@ -9,9 +11,11 @@ import kotlinx.serialization.Serializable * Abstract base class for not-equal (!=) expressions over equational types. */ @Serializable -abstract class NeqExpr> : BinaryExpr() { +abstract class NeqExpr> : BinaryExpr() { companion object { + private const val OPERATOR_LABEL = "/=" + @JvmStatic fun > create2( leftOp: Expr<*>, @@ -24,4 +28,8 @@ abstract class NeqExpr> : BinaryExpr( companion object { - private const val OPERATOR_LABEL = "=" - @JvmStatic fun of( leftOp: Expr>, @@ -45,9 +40,6 @@ data class ArrayEqExpr( } } - override val type: BoolType - get() = Bool() - override fun eval(`val`: Valuation): LitExpr = throw UnsupportedOperationException() override fun of( @@ -56,13 +48,5 @@ data class ArrayEqExpr( ): ArrayEqExpr = Companion.of(leftOp, rightOp) - override val operatorLabel: String = OPERATOR_LABEL - - override fun toString(): String { - return Utils.lispStringBuilder(operatorLabel) - .body() - .add(leftOp) - .add(rightOp) - .toString() - } + override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayNeqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayNeqExpr.kt index e3360a2a26..38edaf44cb 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayNeqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayNeqExpr.kt @@ -1,14 +1,10 @@ package hu.bme.mit.theta.core.type.arraytype -import hu.bme.mit.theta.common.Utils import hu.bme.mit.theta.core.model.Valuation -import hu.bme.mit.theta.core.type.BinaryExpr import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.LitExpr import hu.bme.mit.theta.core.type.Type import hu.bme.mit.theta.core.type.abstracttype.NeqExpr -import hu.bme.mit.theta.core.type.arraytype.ArrayEqExpr.Companion -import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool import hu.bme.mit.theta.core.type.booltype.BoolType import hu.bme.mit.theta.core.utils.TypeUtils.cast import kotlinx.serialization.SerialName @@ -25,7 +21,6 @@ data class ArrayNeqExpr( ) : NeqExpr>() { companion object { - private const val OPERATOR_LABEL = "/=" @JvmStatic fun of( leftOp: Expr>, @@ -43,9 +38,6 @@ data class ArrayNeqExpr( } } - override val type: BoolType - get() = Bool() - override fun eval(`val`: Valuation): LitExpr = throw UnsupportedOperationException() override fun of( @@ -54,13 +46,5 @@ data class ArrayNeqExpr( ): ArrayNeqExpr = Companion.of(leftOp, rightOp) - override val operatorLabel: String = OPERATOR_LABEL - - override fun toString(): String { - return Utils.lispStringBuilder(operatorLabel) - .body() - .add(leftOp) - .add(rightOp) - .toString() - } + override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/IffExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/IffExpr.kt index 0bd99a92da..c107dd9fcc 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/IffExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/IffExpr.kt @@ -1,10 +1,9 @@ package hu.bme.mit.theta.core.type.booltype -import hu.bme.mit.theta.common.Utils import hu.bme.mit.theta.core.model.Valuation import hu.bme.mit.theta.core.type.Expr -import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool import hu.bme.mit.theta.core.type.abstracttype.EqExpr +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool import hu.bme.mit.theta.core.utils.TypeUtils.cast import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -22,19 +21,20 @@ data class IffExpr( companion object { private const val OPERATOR_LABEL = "iff" + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = IffExpr(leftOp, rightOp) + @JvmStatic fun create(leftOp: Expr<*>, rightOp: Expr<*>) = IffExpr(cast(leftOp, Bool()), cast(rightOp, Bool())) } - override val type: BoolType = Bool() + override val operatorLabel: String get() = OPERATOR_LABEL override fun eval(`val`: Valuation): BoolLitExpr = Bool((leftOp.eval(`val`) as BoolLitExpr).value == (rightOp.eval(`val`) as BoolLitExpr).value) override fun of(leftOp: Expr, rightOp: Expr): IffExpr = IffExpr(leftOp, rightOp) - override fun toString(): String = Utils.lispStringBuilder(OPERATOR_LABEL).add(leftOp).add(rightOp).toString() - override val operatorLabel: String get() = OPERATOR_LABEL + override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/XorExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/XorExpr.kt index a8763ea12a..30c6eb523b 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/XorExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/XorExpr.kt @@ -1,6 +1,5 @@ package hu.bme.mit.theta.core.type.booltype -import hu.bme.mit.theta.common.Utils import hu.bme.mit.theta.core.model.Valuation import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.abstracttype.NeqExpr @@ -22,19 +21,21 @@ data class XorExpr( companion object { private const val OPERATOR_LABEL = "xor" + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = XorExpr(leftOp, rightOp) + @JvmStatic fun create(leftOp: Expr<*>, rightOp: Expr<*>) = XorExpr(cast(leftOp, Bool()), cast(rightOp, Bool())) } - override val type: BoolType = Bool() + override val operatorLabel: String get() = OPERATOR_LABEL + override fun eval(`val`: Valuation): BoolLitExpr = Bool((leftOp.eval(`val`) as BoolLitExpr).value != (rightOp.eval(`val`) as BoolLitExpr).value) override fun of(leftOp: Expr, rightOp: Expr): XorExpr = Companion.of(leftOp, rightOp) - override fun toString(): String = Utils.lispStringBuilder(OPERATOR_LABEL).add(leftOp).add(rightOp).toString() - override val operatorLabel: String get() = OPERATOR_LABEL + override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumEqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumEqExpr.kt index 841b88b998..3aaf8edfa5 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumEqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumEqExpr.kt @@ -1,12 +1,9 @@ package hu.bme.mit.theta.core.type.enumtype -import hu.bme.mit.theta.common.Utils import hu.bme.mit.theta.core.model.Valuation -import hu.bme.mit.theta.core.type.BinaryExpr import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.LitExpr import hu.bme.mit.theta.core.type.abstracttype.EqExpr -import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool import hu.bme.mit.theta.core.type.booltype.BoolType import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -20,22 +17,15 @@ data class EnumEqExpr( companion object { - private const val OPERATOR_LABEL = "=" @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = EnumEqExpr(leftOp, rightOp) } - override val operatorLabel: String = OPERATOR_LABEL - override val type: BoolType = Bool() override fun eval(`val`: Valuation): LitExpr = EnumLitExpr.eq(leftOp.eval(`val`) as EnumLitExpr, rightOp.eval(`val`) as EnumLitExpr) override fun of(leftOp: Expr, rightOp: Expr): EnumEqExpr = Companion.of(leftOp, rightOp) - override fun toString(): String = Utils.lispStringBuilder(OPERATOR_LABEL) - .body() - .add(leftOp) - .add(rightOp) - .toString() + override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumNeqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumNeqExpr.kt index 99603a7409..e779851910 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumNeqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumNeqExpr.kt @@ -1,12 +1,9 @@ package hu.bme.mit.theta.core.type.enumtype -import hu.bme.mit.theta.common.Utils import hu.bme.mit.theta.core.model.Valuation -import hu.bme.mit.theta.core.type.BinaryExpr import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.LitExpr import hu.bme.mit.theta.core.type.abstracttype.NeqExpr -import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool import hu.bme.mit.theta.core.type.booltype.BoolType import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -26,16 +23,11 @@ data class EnumNeqExpr( } override val operatorLabel: String = OPERATOR_LABEL - override val type: BoolType = Bool() override fun eval(`val`: Valuation): LitExpr = EnumLitExpr.neq(leftOp.eval(`val`) as EnumLitExpr, rightOp.eval(`val`) as EnumLitExpr) override fun of(leftOp: Expr, rightOp: Expr): EnumNeqExpr = Companion.of(leftOp, rightOp) - override fun toString(): String = Utils.lispStringBuilder(OPERATOR_LABEL) - .body() - .add(leftOp) - .add(rightOp) - .toString() + override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntEqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntEqExpr.kt index b8d63c64e2..1cd5b3bd16 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntEqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntEqExpr.kt @@ -20,8 +20,6 @@ import hu.bme.mit.theta.core.model.Valuation import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.abstracttype.EqExpr import hu.bme.mit.theta.core.type.booltype.BoolLitExpr -import hu.bme.mit.theta.core.type.booltype.BoolType -import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool import hu.bme.mit.theta.core.type.inttype.IntExprs.Int import hu.bme.mit.theta.core.utils.TypeUtils.cast import kotlinx.serialization.SerialName @@ -36,14 +34,13 @@ data class IntEqExpr( companion object { - private const val OPERATOR_LABEL = "=" @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = IntEqExpr(leftOp, rightOp) + @JvmStatic fun create(leftOp: Expr<*>, rightOp: Expr<*>) = IntEqExpr(cast(leftOp, Int()), cast(rightOp, Int())) } - override val type: BoolType = Bool() override fun eval(`val`: Valuation): BoolLitExpr { val leftOpVal = leftOp.eval(`val`) as IntLitExpr val rightOpVal = rightOp.eval(`val`) as IntLitExpr @@ -53,6 +50,6 @@ data class IntEqExpr( override fun of(leftOp: Expr, rightOp: Expr): IntEqExpr = Companion.of(leftOp, rightOp) - override val operatorLabel: String get() = OPERATOR_LABEL + override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntGeqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntGeqExpr.kt index 05b42ccc99..00fa41ac2f 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntGeqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntGeqExpr.kt @@ -20,8 +20,6 @@ import hu.bme.mit.theta.core.model.Valuation import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.abstracttype.GeqExpr import hu.bme.mit.theta.core.type.booltype.BoolLitExpr -import hu.bme.mit.theta.core.type.booltype.BoolType -import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool import hu.bme.mit.theta.core.type.inttype.IntExprs.Int import hu.bme.mit.theta.core.utils.TypeUtils.cast import kotlinx.serialization.SerialName @@ -36,14 +34,13 @@ data class IntGeqExpr( companion object { - private const val OPERATOR_LABEL = ">=" @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = IntGeqExpr(leftOp, rightOp) + @JvmStatic fun create(leftOp: Expr<*>, rightOp: Expr<*>) = IntGeqExpr(cast(leftOp, Int()), cast(rightOp, Int())) } - override val type: BoolType = Bool() override fun eval(`val`: Valuation): BoolLitExpr { val leftOpVal = leftOp.eval(`val`) as IntLitExpr val rightOpVal = rightOp.eval(`val`) as IntLitExpr @@ -53,6 +50,6 @@ data class IntGeqExpr( override fun of(leftOp: Expr, rightOp: Expr): IntGeqExpr = Companion.of(leftOp, rightOp) - override val operatorLabel: String get() = OPERATOR_LABEL + override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntGtExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntGtExpr.kt index 6aa7475d73..985625b85e 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntGtExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntGtExpr.kt @@ -19,9 +19,7 @@ package hu.bme.mit.theta.core.type.inttype import hu.bme.mit.theta.core.model.Valuation import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.abstracttype.GtExpr -import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool import hu.bme.mit.theta.core.type.booltype.BoolLitExpr -import hu.bme.mit.theta.core.type.booltype.BoolType import hu.bme.mit.theta.core.type.inttype.IntExprs.Int import hu.bme.mit.theta.core.utils.TypeUtils.cast import kotlinx.serialization.SerialName @@ -36,14 +34,12 @@ data class IntGtExpr( companion object { - private const val OPERATOR_LABEL = ">" @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = IntGtExpr(leftOp, rightOp) @JvmStatic fun create(leftOp: Expr<*>, rightOp: Expr<*>) = IntGtExpr(cast(leftOp, Int()), cast(rightOp, Int())) } - override val type: BoolType = Bool() override fun eval(`val`: Valuation): BoolLitExpr { val leftOpVal = leftOp.eval(`val`) as IntLitExpr val rightOpVal = rightOp.eval(`val`) as IntLitExpr @@ -53,6 +49,6 @@ data class IntGtExpr( override fun of(leftOp: Expr, rightOp: Expr): IntGtExpr = Companion.of(leftOp, rightOp) - override val operatorLabel: String get() = OPERATOR_LABEL + override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLeqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLeqExpr.kt index f47ea158c0..8b8bac2fb2 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLeqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLeqExpr.kt @@ -20,8 +20,6 @@ import hu.bme.mit.theta.core.model.Valuation import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.abstracttype.LeqExpr import hu.bme.mit.theta.core.type.booltype.BoolLitExpr -import hu.bme.mit.theta.core.type.booltype.BoolType -import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool import hu.bme.mit.theta.core.type.inttype.IntExprs.Int import hu.bme.mit.theta.core.utils.TypeUtils.cast import kotlinx.serialization.SerialName @@ -36,14 +34,13 @@ data class IntLeqExpr( companion object { - private const val OPERATOR_LABEL = "<=" @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = IntLeqExpr(leftOp, rightOp) + @JvmStatic fun create(leftOp: Expr<*>, rightOp: Expr<*>) = IntLeqExpr(cast(leftOp, Int()), cast(rightOp, Int())) } - override val type: BoolType = Bool() override fun eval(`val`: Valuation): BoolLitExpr { val leftOpVal = leftOp.eval(`val`) as IntLitExpr val rightOpVal = rightOp.eval(`val`) as IntLitExpr @@ -53,6 +50,6 @@ data class IntLeqExpr( override fun of(leftOp: Expr, rightOp: Expr): IntLeqExpr = Companion.of(leftOp, rightOp) - override val operatorLabel: String get() = OPERATOR_LABEL + override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLtExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLtExpr.kt index 4e59c1b8b8..cb7e2d4280 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLtExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLtExpr.kt @@ -19,9 +19,7 @@ package hu.bme.mit.theta.core.type.inttype import hu.bme.mit.theta.core.model.Valuation import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.abstracttype.LtExpr -import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool import hu.bme.mit.theta.core.type.booltype.BoolLitExpr -import hu.bme.mit.theta.core.type.booltype.BoolType import hu.bme.mit.theta.core.type.inttype.IntExprs.Int import hu.bme.mit.theta.core.utils.TypeUtils.cast import kotlinx.serialization.SerialName @@ -36,14 +34,13 @@ data class IntLtExpr( companion object { - private const val OPERATOR_LABEL = "<" @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = IntLtExpr(leftOp, rightOp) + @JvmStatic fun create(leftOp: Expr<*>, rightOp: Expr<*>) = IntLtExpr(cast(leftOp, Int()), cast(rightOp, Int())) } - override val type: BoolType = Bool() override fun eval(`val`: Valuation): BoolLitExpr { val leftOpVal = leftOp.eval(`val`) as IntLitExpr val rightOpVal = rightOp.eval(`val`) as IntLitExpr @@ -53,6 +50,7 @@ data class IntLtExpr( override fun of(leftOp: Expr, rightOp: Expr): IntLtExpr = Companion.of(leftOp, rightOp) - override val operatorLabel: String get() = OPERATOR_LABEL + override fun toString(): String = super.toString() + } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntNeqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntNeqExpr.kt index dd7d03209f..a467a7d78f 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntNeqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntNeqExpr.kt @@ -20,8 +20,6 @@ import hu.bme.mit.theta.core.model.Valuation import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.abstracttype.NeqExpr import hu.bme.mit.theta.core.type.booltype.BoolLitExpr -import hu.bme.mit.theta.core.type.booltype.BoolType -import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool import hu.bme.mit.theta.core.type.inttype.IntExprs.Int import hu.bme.mit.theta.core.utils.TypeUtils.cast import kotlinx.serialization.SerialName @@ -36,14 +34,12 @@ data class IntNeqExpr( companion object { - private const val OPERATOR_LABEL = "/=" @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = IntNeqExpr(leftOp, rightOp) @JvmStatic fun create(leftOp: Expr<*>, rightOp: Expr<*>) = IntNeqExpr(cast(leftOp, Int()), cast(rightOp, Int())) } - override val type: BoolType = Bool() override fun eval(`val`: Valuation): BoolLitExpr { val leftOpVal = leftOp.eval(`val`) as IntLitExpr val rightOpVal = rightOp.eval(`val`) as IntLitExpr @@ -53,6 +49,6 @@ data class IntNeqExpr( override fun of(leftOp: Expr, rightOp: Expr): IntNeqExpr = Companion.of(leftOp, rightOp) - override val operatorLabel: String get() = OPERATOR_LABEL + override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatAddExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatAddExpr.kt index 217a7b3b38..450a5b5325 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatAddExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatAddExpr.kt @@ -13,84 +13,55 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.rattype; -import static com.google.common.collect.ImmutableList.toImmutableList; -import static hu.bme.mit.theta.core.type.rattype.RatExprs.Rat; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; +package hu.bme.mit.theta.core.type.rattype -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.AddExpr; -import java.math.BigInteger; -import java.util.List; +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.AddExpr +import hu.bme.mit.theta.core.type.rattype.RatExprs.Rat +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import java.math.BigInteger -public final class RatAddExpr extends AddExpr { +@Serializable +@SerialName("RatAdd") +class RatAddExpr( + override val ops: List> +) : AddExpr() { - private static final int HASH_SEED = 4909; - private static final String OPERATOR_LABEL = "+"; + companion object { - private RatAddExpr(final Iterable> ops) { - super(ops); - } - - public static RatAddExpr of(final Iterable> ops) { - return new RatAddExpr(ops); - } + private const val OPERATOR_LABEL = "+" - public static RatAddExpr create(final List> ops) { - return RatAddExpr.of(ops.stream().map(op -> cast(op, Rat())).collect(toImmutableList())); - } - - @Override - public RatType getType() { - return Rat(); - } + @JvmStatic + fun of(ops: Iterable>): RatAddExpr = RatAddExpr(ops.toList()) - @Override - public RatLitExpr eval(final Valuation val) { - var sumNum = BigInteger.ZERO; - var sumDenom = BigInteger.ONE; - for (final Expr op : getOps()) { - final RatLitExpr opLit = (RatLitExpr) op.eval(val); - final var leftNum = sumNum; - final var leftDenom = sumDenom; - final var rightNum = opLit.getNum(); - final var rightDenom = opLit.getDenom(); - sumNum = leftNum.multiply(rightDenom).add(leftDenom.multiply(rightNum)); - sumDenom = leftDenom.multiply(rightDenom); - } - return Rat(sumNum, sumDenom); + @Suppress("UNCHECKED_CAST") + @JvmStatic + fun create(ops: Iterable>): RatAddExpr = + RatAddExpr(ops.map { it as Expr }) } - @Override - public RatAddExpr with(final Iterable> ops) { - if (ops == getOps()) { - return this; - } else { - return RatAddExpr.of(ops); - } - } + override val type: RatType = Rat() - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final RatAddExpr that = (RatAddExpr) obj; - return this.getOps().equals(that.getOps()); - } else { - return false; + override fun eval(`val`: Valuation): RatLitExpr { + var sumNum = BigInteger.ZERO + var sumDenom = BigInteger.ONE + ops.forEach { op -> + val opLit = op.eval(`val`) as RatLitExpr + val leftNum = sumNum + val leftDenom = sumDenom + val rightNum = opLit.num + val rightDenom = opLit.denom + sumNum = leftNum.multiply(rightDenom).add(leftDenom.multiply(rightNum)) + sumDenom = leftDenom.multiply(rightDenom) } + return Rat(sumNum, sumDenom) } - @Override - protected int getHashSeed() { - return HASH_SEED; - } + override fun of(ops: List>): RatAddExpr = of(ops) - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } + override val operatorLabel: String = OPERATOR_LABEL } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatDivExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatDivExpr.kt index 3ea6f47448..e2449829a6 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatDivExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatDivExpr.kt @@ -13,104 +13,56 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.rattype; -import static hu.bme.mit.theta.core.type.rattype.RatExprs.Rat; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.DivExpr; -import hu.bme.mit.theta.core.type.inttype.IntToRatExpr; -import hu.bme.mit.theta.core.type.inttype.IntType; - -public final class RatDivExpr extends DivExpr { - - private static final int HASH_SEED = 139; - - private static final String OPERATOR_LABEL = "/"; - - private RatDivExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - } - - public static RatDivExpr of(final Expr leftOp, final Expr rightOp) { - return new RatDivExpr(leftOp, rightOp); - } - - public static RatDivExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp; - if (leftOp.getType() instanceof RatType) { - newLeftOp = cast(leftOp, Rat()); - } else if (leftOp.getType() instanceof IntType) { - newLeftOp = IntToRatExpr.create(leftOp); - } else { - throw new IllegalArgumentException("Unsupported type for RatDiv: " + leftOp.getType()); - } - - final Expr newRightOp; - if (rightOp.getType() instanceof RatType) { - newRightOp = cast(rightOp, Rat()); - } else if (rightOp.getType() instanceof IntType) { - newRightOp = IntToRatExpr.create(rightOp); - } else { - throw new IllegalArgumentException("Unsupported type for RatDiv: " + leftOp.getType()); +package hu.bme.mit.theta.core.type.rattype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.DivExpr +import hu.bme.mit.theta.core.type.inttype.IntToRatExpr +import hu.bme.mit.theta.core.type.inttype.IntType +import hu.bme.mit.theta.core.type.rattype.RatExprs.Rat +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("RatDiv") +data class RatDivExpr( + override val leftOp: Expr, + override val rightOp: Expr +) : DivExpr() { + + companion object { + internal const val OPERATOR_LABEL = "/" + @JvmStatic + fun of(leftOp: Expr, rightOp: Expr) = RatDivExpr(leftOp, rightOp) + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) : RatDivExpr { + val newLeftOp = when (leftOp.type) { + is RatType -> cast(leftOp, Rat()) + is IntType -> IntToRatExpr.create(leftOp) + else -> throw IllegalArgumentException("Unsupported type for RatDiv: ${leftOp.type}") + } + val newRightOp = when (rightOp.type) { + is RatType -> cast(rightOp, Rat()) + is IntType -> IntToRatExpr.create(rightOp) + else -> throw IllegalArgumentException("Unsupported type for RatDiv: ${rightOp.type}") + } + return RatDivExpr(newLeftOp, newRightOp) } - - return RatDivExpr.of(newLeftOp, newRightOp); } - @Override - public RatType getType() { - return Rat(); + override val type: RatType = Rat() + override fun eval(`val`: Valuation): RatLitExpr { + val leftOpVal = leftOp.eval(`val`) as RatLitExpr + val rightOpVal = rightOp.eval(`val`) as RatLitExpr + return leftOpVal.div(rightOpVal) } - @Override - public RatLitExpr eval(final Valuation val) { - final RatLitExpr leftOpVal = (RatLitExpr) getLeftOp().eval(val); - final RatLitExpr rightOpVal = (RatLitExpr) getRightOp().eval(val); - return leftOpVal.div(rightOpVal); - } + override fun of(leftOp: Expr, rightOp: Expr): RatDivExpr = + Companion.of(leftOp, rightOp) - @Override - public RatDivExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return RatDivExpr.of(leftOp, rightOp); - } - } - - @Override - public RatDivExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } - - @Override - public RatDivExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final RatDivExpr that = (RatDivExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } + override val operatorLabel: String get() = OPERATOR_LABEL } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatEqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatEqExpr.kt index 06caf929ba..72c35f28b2 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatEqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatEqExpr.kt @@ -13,88 +13,43 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.rattype; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.type.rattype.RatExprs.Rat; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; +package hu.bme.mit.theta.core.type.rattype -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.EqExpr; -import hu.bme.mit.theta.core.type.booltype.BoolLitExpr; -import hu.bme.mit.theta.core.type.booltype.BoolType; +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.EqExpr +import hu.bme.mit.theta.core.type.booltype.BoolLitExpr +import hu.bme.mit.theta.core.type.rattype.RatExprs.Rat +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -public final class RatEqExpr extends EqExpr { +@Serializable +@SerialName("RatEq") +data class RatEqExpr( + override val leftOp: Expr, + override val rightOp: Expr +) : EqExpr() { - private static final int HASH_SEED = 3709; - private static final String OPERATOR_LABEL = "="; + companion object { - private RatEqExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - } - - public static RatEqExpr of(final Expr leftOp, final Expr rightOp) { - return new RatEqExpr(leftOp, rightOp); - } - - public static RatEqExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = cast(leftOp, Rat()); - final Expr newRightOp = cast(rightOp, Rat()); - return RatEqExpr.of(newLeftOp, newRightOp); - } - - @Override - public BoolType getType() { - return Bool(); - } - - @Override - public BoolLitExpr eval(final Valuation val) { - final RatLitExpr leftOpVal = (RatLitExpr) getLeftOp().eval(val); - final RatLitExpr rightOpVal = (RatLitExpr) getRightOp().eval(val); - return leftOpVal.eq(rightOpVal); - } - - @Override - public RatEqExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return RatEqExpr.of(leftOp, rightOp); - } - } - - @Override - public RatEqExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } + @JvmStatic + fun of(leftOp: Expr, rightOp: Expr) = RatEqExpr(leftOp, rightOp) - @Override - public RatEqExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = RatEqExpr(cast(leftOp, Rat()), cast(rightOp, Rat())) } - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final RatEqExpr that = (RatEqExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } + override fun eval(`val`: Valuation): BoolLitExpr { + val leftOpVal = leftOp.eval(`val`) as RatLitExpr + val rightOpVal = rightOp.eval(`val`) as RatLitExpr + return leftOpVal.eq(rightOpVal) } - @Override - protected int getHashSeed() { - return HASH_SEED; - } + override fun of(leftOp: Expr, rightOp: Expr): RatEqExpr = + Companion.of(leftOp, rightOp) - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } + override fun toString(): String = super.toString() } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatExprs.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatExprs.kt index ac20b0388e..ba55a5c4bc 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatExprs.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatExprs.kt @@ -13,163 +13,69 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.rattype; -import com.google.common.collect.ImmutableList; -import hu.bme.mit.theta.core.type.Expr; -import java.math.BigInteger; +package hu.bme.mit.theta.core.type.rattype -public final class RatExprs { +import hu.bme.mit.theta.core.type.Expr +import java.math.BigInteger - private RatExprs() {} - - public static RatType Rat() { - return RatType.getInstance(); - } - - public static RatLitExpr Rat(final int num, final int denom) { - return RatLitExpr.of(BigInteger.valueOf(num), BigInteger.valueOf(denom)); - } - - public static RatLitExpr Rat(final int num, final String denom) { - return RatLitExpr.of(BigInteger.valueOf(num), new BigInteger(denom)); - } - - public static RatLitExpr Rat(final int num, final BigInteger denom) { - return RatLitExpr.of(BigInteger.valueOf(num), denom); - } - - public static RatLitExpr Rat(final String num, final int denom) { - return RatLitExpr.of(new BigInteger(num), BigInteger.valueOf(denom)); - } - - public static RatLitExpr Rat(final String num, final String denom) { - return RatLitExpr.of(new BigInteger(num), new BigInteger(denom)); - } - - public static RatLitExpr Rat(final String num, final BigInteger denom) { - return RatLitExpr.of(new BigInteger(num), denom); - } - - public static RatLitExpr Rat(final BigInteger num, final int denom) { - return RatLitExpr.of(num, BigInteger.valueOf(denom)); - } - - public static RatLitExpr Rat(final BigInteger num, final String denom) { - return RatLitExpr.of(num, new BigInteger(denom)); - } - - public static RatLitExpr Rat(final BigInteger num, final BigInteger denom) { - return RatLitExpr.of(num, denom); - } - - public static RatAddExpr Add(final Iterable> ops) { - return RatAddExpr.of(ops); - } - - public static RatSubExpr Sub(final Expr leftOp, final Expr rightOp) { - return RatSubExpr.of(leftOp, rightOp); - } - - public static RatPosExpr Pos(final Expr op) { - return RatPosExpr.of(op); - } - - public static RatNegExpr Neg(final Expr op) { - return RatNegExpr.of(op); - } - - public static RatMulExpr Mul(final Iterable> ops) { - return RatMulExpr.of(ops); - } - - public static RatDivExpr Div(final Expr leftOp, final Expr rightOp) { - return RatDivExpr.of(leftOp, rightOp); - } - - public static RatEqExpr Eq(final Expr leftOp, final Expr rightOp) { - return RatEqExpr.of(leftOp, rightOp); - } - - public static RatNeqExpr Neq(final Expr leftOp, final Expr rightOp) { - return RatNeqExpr.of(leftOp, rightOp); - } - - public static RatLtExpr Lt(final Expr leftOp, final Expr rightOp) { - return RatLtExpr.of(leftOp, rightOp); - } - - public static RatLeqExpr Leq(final Expr leftOp, final Expr rightOp) { - return RatLeqExpr.of(leftOp, rightOp); - } - - public static RatGtExpr Gt(final Expr leftOp, final Expr rightOp) { - return RatGtExpr.of(leftOp, rightOp); - } - - public static RatGeqExpr Geq(final Expr leftOp, final Expr rightOp) { - return RatGeqExpr.of(leftOp, rightOp); - } - - /* - * Convenience methods - */ - - public static RatAddExpr Add(final Expr op1, final Expr op2) { - return RatAddExpr.of(ImmutableList.of(op1, op2)); - } - - public static RatAddExpr Add( - final Expr op1, final Expr op2, final Expr op3) { - return RatAddExpr.of(ImmutableList.of(op1, op2, op3)); - } - - public static RatAddExpr Add( - final Expr op1, - final Expr op2, - final Expr op3, - final Expr op4) { - return RatAddExpr.of(ImmutableList.of(op1, op2, op3, op4)); - } - - public static RatAddExpr Add( - final Expr op1, - final Expr op2, - final Expr op3, - final Expr op4, - final Expr op5) { - return RatAddExpr.of(ImmutableList.of(op1, op2, op3, op4, op5)); - } - - //// - - public static RatMulExpr Mul(final Expr op1, final Expr op2) { - return RatMulExpr.of(ImmutableList.of(op1, op2)); - } - - public static RatMulExpr Mul( - final Expr op1, final Expr op2, final Expr op3) { - return RatMulExpr.of(ImmutableList.of(op1, op2, op3)); - } - - public static RatMulExpr Mul( - final Expr op1, - final Expr op2, - final Expr op3, - final Expr op4) { - return RatMulExpr.of(ImmutableList.of(op1, op2, op3, op4)); - } - - public static RatMulExpr Mul( - final Expr op1, - final Expr op2, - final Expr op3, - final Expr op4, - final Expr op5) { - return RatMulExpr.of(ImmutableList.of(op1, op2, op3, op4, op5)); - } - - public static RatToIntExpr ToInt(Expr op) { - return RatToIntExpr.of(op); - } +/** + * Factory for rational expressions. + */ +@Suppress("FunctionName") +object RatExprs { + @JvmStatic + fun Rat() = RatType + @JvmStatic + fun Rat(num: Int, denom: Int) = RatLitExpr(BigInteger.valueOf(num.toLong()), BigInteger.valueOf(denom.toLong())) + @JvmStatic + fun Rat(num: Int, denom: String) = RatLitExpr(BigInteger.valueOf(num.toLong()), BigInteger(denom)) + @JvmStatic + fun Rat(num: Int, denom: BigInteger) = RatLitExpr(BigInteger.valueOf(num.toLong()), denom) + @JvmStatic + fun Rat(num: String, denom: Int) = RatLitExpr(BigInteger(num), BigInteger.valueOf(denom.toLong())) + @JvmStatic + fun Rat(num: String, denom: String) = RatLitExpr(BigInteger(num), BigInteger(denom)) + @JvmStatic + fun Rat(num: String, denom: BigInteger) = RatLitExpr(BigInteger(num), denom) + @JvmStatic + fun Rat(num: BigInteger, denom: Int) = RatLitExpr(num, BigInteger.valueOf(denom.toLong())) + @JvmStatic + fun Rat(num: BigInteger, denom: String) = RatLitExpr(num, BigInteger(denom)) + @JvmStatic + fun Rat(num: BigInteger, denom: BigInteger) = RatLitExpr(num, denom) + + @JvmStatic + fun Add(ops: Iterable>) = RatAddExpr.of(ops) + @JvmStatic + fun Sub(leftOp: Expr, rightOp: Expr) = RatSubExpr(leftOp, rightOp) + @JvmStatic + fun Pos(op: Expr) = RatPosExpr(op) + @JvmStatic + fun Neg(op: Expr) = RatNegExpr(op) + @JvmStatic + fun Mul(ops: Iterable>) = RatMulExpr.of(ops) + @JvmStatic + fun Div(leftOp: Expr, rightOp: Expr) = RatDivExpr(leftOp, rightOp) + @JvmStatic + fun Eq(leftOp: Expr, rightOp: Expr) = RatEqExpr(leftOp, rightOp) + @JvmStatic + fun Neq(leftOp: Expr, rightOp: Expr) = RatNeqExpr(leftOp, rightOp) + @JvmStatic + fun Lt(leftOp: Expr, rightOp: Expr) = RatLtExpr(leftOp, rightOp) + @JvmStatic + fun Leq(leftOp: Expr, rightOp: Expr) = RatLeqExpr(leftOp, rightOp) + @JvmStatic + fun Gt(leftOp: Expr, rightOp: Expr) = RatGtExpr(leftOp, rightOp) + @JvmStatic + fun Geq(leftOp: Expr, rightOp: Expr) = RatGeqExpr(leftOp, rightOp) + + @JvmStatic + fun Add(vararg ops: Expr) = RatAddExpr(ops.asList()) + + @JvmStatic + fun Mul(vararg ops: Expr) = RatMulExpr(ops.asList()) + + @JvmStatic + fun ToInt(op: Expr) = RatToIntExpr.of(op) } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatGeqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatGeqExpr.kt index fd85a817de..5c6732a5f8 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatGeqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatGeqExpr.kt @@ -13,88 +13,43 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.rattype; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.type.rattype.RatExprs.Rat; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; +package hu.bme.mit.theta.core.type.rattype -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.GeqExpr; -import hu.bme.mit.theta.core.type.booltype.BoolLitExpr; -import hu.bme.mit.theta.core.type.booltype.BoolType; +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.GeqExpr +import hu.bme.mit.theta.core.type.booltype.BoolLitExpr +import hu.bme.mit.theta.core.type.rattype.RatExprs.Rat +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -public final class RatGeqExpr extends GeqExpr { +@Serializable +@SerialName("RatGeq") +data class RatGeqExpr( + override val leftOp: Expr, + override val rightOp: Expr +) : GeqExpr() { - private static final int HASH_SEED = 6101; - private static final String OPERATOR_LABEL = ">="; + companion object { - private RatGeqExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - } - - public static RatGeqExpr of(final Expr leftOp, final Expr rightOp) { - return new RatGeqExpr(leftOp, rightOp); - } - - public static RatGeqExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = cast(leftOp, Rat()); - final Expr newRightOp = cast(rightOp, Rat()); - return RatGeqExpr.of(newLeftOp, newRightOp); - } - - @Override - public BoolType getType() { - return Bool(); - } - - @Override - public BoolLitExpr eval(final Valuation val) { - final RatLitExpr leftOpVal = (RatLitExpr) getLeftOp().eval(val); - final RatLitExpr rightOpVal = (RatLitExpr) getRightOp().eval(val); - return leftOpVal.geq(rightOpVal); - } - - @Override - public RatGeqExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return RatGeqExpr.of(leftOp, rightOp); - } - } - - @Override - public RatGeqExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } + @JvmStatic + fun of(leftOp: Expr, rightOp: Expr) = RatGeqExpr(leftOp, rightOp) - @Override - public RatGeqExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = RatGeqExpr(cast(leftOp, Rat()), cast(rightOp, Rat())) } - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final RatGeqExpr that = (RatGeqExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } + override fun eval(`val`: Valuation): BoolLitExpr { + val leftOpVal = leftOp.eval(`val`) as RatLitExpr + val rightOpVal = rightOp.eval(`val`) as RatLitExpr + return leftOpVal.geq(rightOpVal) } - @Override - protected int getHashSeed() { - return HASH_SEED; - } + override fun of(leftOp: Expr, rightOp: Expr): RatGeqExpr = + Companion.of(leftOp, rightOp) - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } + override fun toString(): String = super.toString() } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatGtExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatGtExpr.kt index f82cbd198c..85c5a0e5c1 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatGtExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatGtExpr.kt @@ -13,88 +13,43 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.rattype; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.type.rattype.RatExprs.Rat; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; +package hu.bme.mit.theta.core.type.rattype -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.GtExpr; -import hu.bme.mit.theta.core.type.booltype.BoolLitExpr; -import hu.bme.mit.theta.core.type.booltype.BoolType; +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.GtExpr +import hu.bme.mit.theta.core.type.booltype.BoolLitExpr +import hu.bme.mit.theta.core.type.rattype.RatExprs.Rat +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -public final class RatGtExpr extends GtExpr { +@Serializable +@SerialName("RatGt") +data class RatGtExpr( + override val leftOp: Expr, + override val rightOp: Expr +) : GtExpr() { - private static final int HASH_SEED = 8161; - private static final String OPERATOR_LABEL = ">"; + companion object { - private RatGtExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - } - - public static RatGtExpr of(final Expr leftOp, final Expr rightOp) { - return new RatGtExpr(leftOp, rightOp); - } - - public static RatGtExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = cast(leftOp, Rat()); - final Expr newRightOp = cast(rightOp, Rat()); - return RatGtExpr.of(newLeftOp, newRightOp); - } - - @Override - public BoolType getType() { - return Bool(); - } - - @Override - public BoolLitExpr eval(final Valuation val) { - final RatLitExpr leftOpVal = (RatLitExpr) getLeftOp().eval(val); - final RatLitExpr rightOpVal = (RatLitExpr) getRightOp().eval(val); - return leftOpVal.gt(rightOpVal); - } - - @Override - public RatGtExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return RatGtExpr.of(leftOp, rightOp); - } - } - - @Override - public RatGtExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } + @JvmStatic + fun of(leftOp: Expr, rightOp: Expr) = RatGtExpr(leftOp, rightOp) - @Override - public RatGtExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = RatGtExpr(cast(leftOp, Rat()), cast(rightOp, Rat())) } - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final RatGtExpr that = (RatGtExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } + override fun eval(`val`: Valuation): BoolLitExpr { + val leftOpVal = leftOp.eval(`val`) as RatLitExpr + val rightOpVal = rightOp.eval(`val`) as RatLitExpr + return leftOpVal.gt(rightOpVal) } - @Override - protected int getHashSeed() { - return HASH_SEED; - } + override fun of(leftOp: Expr, rightOp: Expr): RatGtExpr = + Companion.of(leftOp, rightOp) - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } + override fun toString(): String = super.toString() } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatLeqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatLeqExpr.kt index 11ac8d3c7d..805a6c7274 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatLeqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatLeqExpr.kt @@ -13,88 +13,41 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.rattype; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.type.rattype.RatExprs.Rat; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; +package hu.bme.mit.theta.core.type.rattype -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.LeqExpr; -import hu.bme.mit.theta.core.type.booltype.BoolLitExpr; -import hu.bme.mit.theta.core.type.booltype.BoolType; +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.LeqExpr +import hu.bme.mit.theta.core.type.booltype.BoolLitExpr +import hu.bme.mit.theta.core.type.rattype.RatExprs.Rat +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -public final class RatLeqExpr extends LeqExpr { +@Serializable +@SerialName("RatLeq") +data class RatLeqExpr( + override val leftOp: Expr, + override val rightOp: Expr +) : LeqExpr() { - private static final int HASH_SEED = 5479; - private static final String OPERATOR_LABEL = "<="; - - private RatLeqExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - } - - public static RatLeqExpr of(final Expr leftOp, final Expr rightOp) { - return new RatLeqExpr(leftOp, rightOp); - } - - public static RatLeqExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = cast(leftOp, Rat()); - final Expr newRightOp = cast(rightOp, Rat()); - return RatLeqExpr.of(newLeftOp, newRightOp); - } - - @Override - public BoolType getType() { - return Bool(); - } - - @Override - public BoolLitExpr eval(final Valuation val) { - final RatLitExpr leftOpVal = (RatLitExpr) getLeftOp().eval(val); - final RatLitExpr rightOpVal = (RatLitExpr) getRightOp().eval(val); - return leftOpVal.leq(rightOpVal); + companion object { + @JvmStatic + fun of(leftOp: Expr, rightOp: Expr) = RatLeqExpr(leftOp, rightOp) + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = RatLeqExpr(cast(leftOp, Rat()), cast(rightOp, Rat())) } - @Override - public RatLeqExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return RatLeqExpr.of(leftOp, rightOp); - } + override fun eval(`val`: Valuation): BoolLitExpr { + val leftOpVal = leftOp.eval(`val`) as RatLitExpr + val rightOpVal = rightOp.eval(`val`) as RatLitExpr + return leftOpVal.leq(rightOpVal) } - @Override - public RatLeqExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } - - @Override - public RatLeqExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final RatLeqExpr that = (RatLeqExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } + override fun of(leftOp: Expr, rightOp: Expr): RatLeqExpr = + Companion.of(leftOp, rightOp) - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } + override fun toString(): String = super.toString() } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatLitExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatLitExpr.kt index 7cc6540a0d..58cec8f2a1 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatLitExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatLitExpr.kt @@ -13,212 +13,89 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.rattype; -import static com.google.common.base.Preconditions.checkArgument; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.type.rattype.RatExprs.Rat; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.type.NullaryExpr; -import hu.bme.mit.theta.core.type.booltype.BoolLitExpr; -import hu.bme.mit.theta.core.type.inttype.IntLitExpr; -import java.math.BigInteger; - -public final class RatLitExpr extends NullaryExpr - implements LitExpr, Comparable { - - private static final int HASH_SEED = 149; - - private final BigInteger num; - private final BigInteger denom; - - private volatile int hashCode = 0; - - private RatLitExpr(final BigInteger num, final BigInteger denom) { - checkArgument(denom.compareTo(BigInteger.ZERO) != 0); - - final var gcd = num.abs().gcd(denom.abs()); - if (denom.compareTo(BigInteger.ZERO) >= 0) { - this.num = num.divide(gcd); - this.denom = denom.divide(gcd); - } else { - this.num = num.divide(gcd).negate(); - this.denom = denom.divide(gcd).negate(); +package hu.bme.mit.theta.core.type.rattype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.serialization.BigIntegerSerializer +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.type.NullaryExpr +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool +import hu.bme.mit.theta.core.type.inttype.IntLitExpr +import hu.bme.mit.theta.core.type.rattype.RatExprs.Rat +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import java.math.BigInteger + +@Serializable +@SerialName("RatLit") +data class RatLitExpr( + @Serializable(with = BigIntegerSerializer::class) + val num: BigInteger, + @Serializable(with = BigIntegerSerializer::class) + val denom: BigInteger +) : NullaryExpr(), LitExpr, Comparable { + + init { + require(denom != BigInteger.ZERO) + } + + companion object { + + @JvmStatic + fun of(num: BigInteger, denom: BigInteger): RatLitExpr { + require(denom != BigInteger.ZERO) { "Denominator cannot be zero" } + + val gcd = num.abs().gcd(denom.abs()) + val (simplifiedNum, simplifiedDenom) = if (denom >= BigInteger.ZERO) { + num.divide(gcd) to denom.divide(gcd) + } else { + num.divide(gcd).negate() to denom.divide(gcd).negate() + } + return RatLitExpr(simplifiedNum, simplifiedDenom) } } - public static RatLitExpr of(final BigInteger num, final BigInteger denom) { - return new RatLitExpr(num, denom); - } - - @Override - public RatType getType() { - return Rat(); - } - - @Override - public LitExpr eval(final Valuation val) { - return this; - } - - public BigInteger getNum() { - return num; - } - - public BigInteger getDenom() { - return denom; - } + override val type: RatType = Rat() + override fun eval(`val`: Valuation): RatLitExpr = this - public int sign() { - return num.signum(); - } + fun sign(): Int = num.signum() + fun floor(): BigInteger = + if (num >= BigInteger.ZERO || num.mod(denom) == BigInteger.ZERO) num / denom + else num / denom - BigInteger.ONE - public BigInteger floor() { - if (num.compareTo(BigInteger.ZERO) >= 0 || num.mod(denom).compareTo(BigInteger.ZERO) == 0) { - return num.divide(denom); - } else { - return num.divide(denom).subtract(BigInteger.ONE); - } - } + fun ceil(): BigInteger = + if (num <= BigInteger.ZERO || num.mod(denom) == BigInteger.ZERO) num / denom + else num / denom + BigInteger.ONE - public BigInteger ceil() { - if (num.compareTo(BigInteger.ZERO) <= 0 || num.mod(denom).compareTo(BigInteger.ZERO) == 0) { - return num.divide(denom); - } else { - return num.divide(denom).add(BigInteger.ONE); - } - } + fun add(that: RatLitExpr) = + of(this.num * that.denom + this.denom * that.num, this.denom * that.denom) - public RatLitExpr add(final RatLitExpr that) { - return RatLitExpr.of( - this.getNum() - .multiply(that.getDenom()) - .add(this.getDenom().multiply(that.getNum())), - this.getDenom().multiply(that.getDenom())); - } + fun sub(that: RatLitExpr) = + of(this.num * that.denom - this.denom * that.num, this.denom * that.denom) - public RatLitExpr sub(final RatLitExpr that) { - return RatLitExpr.of( - this.getNum() - .multiply(that.getDenom()) - .subtract(this.getDenom().multiply(that.getNum())), - this.getDenom().multiply(that.getDenom())); - } + fun pos() = of(this.num, this.denom) + fun neg() = of(this.num.negate(), this.denom) + fun mul(that: RatLitExpr) = + of(this.num * that.num, this.denom * that.denom) - public RatLitExpr pos() { - return RatLitExpr.of(this.getNum(), this.getDenom()); - } + fun div(that: RatLitExpr) = + of(this.num * that.denom, this.denom * that.num) - public RatLitExpr neg() { - return RatLitExpr.of(this.getNum().negate(), this.getDenom()); - } + fun eq(that: RatLitExpr) = Bool(this.num == that.num && this.denom == that.denom) + fun neq(that: RatLitExpr) = Bool(this.num != that.num || this.denom != that.denom) + fun lt(that: RatLitExpr) = Bool(this.num * that.denom < this.denom * that.num) + fun leq(that: RatLitExpr) = Bool(this.num * that.denom <= this.denom * that.num) + fun gt(that: RatLitExpr) = Bool(this.num * that.denom > this.denom * that.num) + fun geq(that: RatLitExpr) = Bool(this.num * that.denom >= this.denom * that.num) + fun abs(): RatLitExpr = of(num.abs(), denom) + fun frac(): RatLitExpr = sub(of(floor(), BigInteger.ONE)) - public RatLitExpr mul(final RatLitExpr that) { - return RatLitExpr.of( - this.getNum().multiply(that.getNum()), this.getDenom().multiply(that.getDenom())); - } + override fun compareTo(other: RatLitExpr): Int = + (this.num * other.denom).compareTo(this.denom * other.num) - public RatLitExpr div(final RatLitExpr that) { - return RatLitExpr.of( - this.getNum().multiply(that.getDenom()), this.getDenom().multiply(that.getNum())); - } + fun toInt(): IntLitExpr = IntLitExpr(num.divide(denom)) - public BoolLitExpr eq(final RatLitExpr that) { - return Bool( - this.getNum().compareTo(that.getNum()) == 0 - && this.getDenom().compareTo(that.getDenom()) == 0); - } - - public BoolLitExpr neq(final RatLitExpr that) { - return Bool( - this.getNum().compareTo(that.getNum()) != 0 - || this.getDenom().compareTo(that.getDenom()) != 0); - } - - public BoolLitExpr lt(final RatLitExpr that) { - return Bool( - this.getNum() - .multiply(that.getDenom()) - .compareTo(this.getDenom().multiply(that.getNum())) - < 0); - } - - public BoolLitExpr leq(final RatLitExpr that) { - return Bool( - this.getNum() - .multiply(that.getDenom()) - .compareTo(this.getDenom().multiply(that.getNum())) - <= 0); - } - - public BoolLitExpr gt(final RatLitExpr that) { - return Bool( - this.getNum() - .multiply(that.getDenom()) - .compareTo(this.getDenom().multiply(that.getNum())) - > 0); - } - - public BoolLitExpr geq(final RatLitExpr that) { - return Bool( - this.getNum() - .multiply(that.getDenom()) - .compareTo(this.getDenom().multiply(that.getNum())) - >= 0); - } - - public RatLitExpr abs() { - return RatLitExpr.of(num.abs(), denom); - } - - public RatLitExpr frac() { - return sub(of(floor(), BigInteger.ONE)); - } - - @Override - public int hashCode() { - int result = hashCode; - if (result == 0) { - result = HASH_SEED; - result = 31 * result + num.hashCode(); - result = 31 * result + denom.hashCode(); - hashCode = result; - } - return hashCode; - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final RatLitExpr that = (RatLitExpr) obj; - return (this.getNum().compareTo(that.getNum()) == 0 - && this.getDenom().compareTo(that.getDenom()) == 0); - } else { - return false; - } - } - - @Override - public String toString() { - final StringBuilder sb = new StringBuilder(); - sb.append(getNum()); - sb.append('%'); - sb.append(getDenom()); - return sb.toString(); - } - - @Override - public int compareTo(final RatLitExpr that) { - return this.getNum() - .multiply(that.getDenom()) - .compareTo(this.getDenom().multiply(that.getNum())); - } - - public IntLitExpr toInt() { - return IntLitExpr.of(num.divide(denom)); - } + override fun toString(): String = "$num%$denom" } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatLtExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatLtExpr.kt index b8bdf550fa..d46a03f1d2 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatLtExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatLtExpr.kt @@ -13,88 +13,43 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.rattype; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.type.rattype.RatExprs.Rat; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; +package hu.bme.mit.theta.core.type.rattype -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.LtExpr; -import hu.bme.mit.theta.core.type.booltype.BoolLitExpr; -import hu.bme.mit.theta.core.type.booltype.BoolType; +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.LtExpr +import hu.bme.mit.theta.core.type.booltype.BoolLitExpr +import hu.bme.mit.theta.core.type.rattype.RatExprs.Rat +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -public final class RatLtExpr extends LtExpr { +@Serializable +@SerialName("RatLt") +data class RatLtExpr( + override val leftOp: Expr, + override val rightOp: Expr +) : LtExpr() { - private static final int HASH_SEED = 6311; - private static final String OPERATOR_LABEL = "<"; + companion object { - private RatLtExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - } - - public static RatLtExpr of(final Expr leftOp, final Expr rightOp) { - return new RatLtExpr(leftOp, rightOp); - } - - public static RatLtExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = cast(leftOp, Rat()); - final Expr newRightOp = cast(rightOp, Rat()); - return RatLtExpr.of(newLeftOp, newRightOp); - } - - @Override - public BoolType getType() { - return Bool(); - } - - @Override - public BoolLitExpr eval(final Valuation val) { - final RatLitExpr leftOpVal = (RatLitExpr) getLeftOp().eval(val); - final RatLitExpr rightOpVal = (RatLitExpr) getRightOp().eval(val); - return leftOpVal.lt(rightOpVal); - } - - @Override - public RatLtExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return new RatLtExpr(leftOp, rightOp); - } - } - - @Override - public RatLtExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } + @JvmStatic + fun of(leftOp: Expr, rightOp: Expr) = RatLtExpr(leftOp, rightOp) - @Override - public RatLtExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = RatLtExpr(cast(leftOp, Rat()), cast(rightOp, Rat())) } - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final RatLtExpr that = (RatLtExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } + override fun eval(`val`: Valuation): BoolLitExpr { + val leftOpVal = leftOp.eval(`val`) as RatLitExpr + val rightOpVal = rightOp.eval(`val`) as RatLitExpr + return leftOpVal.lt(rightOpVal) } - @Override - protected int getHashSeed() { - return HASH_SEED; - } + override fun of(leftOp: Expr, rightOp: Expr): RatLtExpr = + Companion.of(leftOp, rightOp) - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } + override fun toString(): String = super.toString() } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatMulExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatMulExpr.kt index 9663c45b12..4234d53888 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatMulExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatMulExpr.kt @@ -13,80 +13,50 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.rattype; -import static com.google.common.collect.ImmutableList.toImmutableList; -import static hu.bme.mit.theta.core.type.rattype.RatExprs.Rat; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; +package hu.bme.mit.theta.core.type.rattype -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.MulExpr; -import java.math.BigInteger; -import java.util.List; +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.MulExpr +import hu.bme.mit.theta.core.type.rattype.RatExprs.Rat +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import java.math.BigInteger -public final class RatMulExpr extends MulExpr { +@Serializable +@SerialName("RatMul") +data class RatMulExpr( + override val ops: List> +) : MulExpr() { - private static final int HASH_SEED = 9479; - private static final String OPERATOR_LABEL = "*"; + companion object { - private RatMulExpr(final Iterable> ops) { - super(ops); - } - - public static RatMulExpr of(final Iterable> ops) { - return new RatMulExpr(ops); - } + internal const val OPERATOR_LABEL = "*" - public static RatMulExpr create(final List> ops) { - return RatMulExpr.of(ops.stream().map(op -> cast(op, Rat())).collect(toImmutableList())); - } + @JvmStatic + fun of(ops: Iterable>) = RatMulExpr(ops.toList()) - @Override - public RatType getType() { - return Rat(); + @JvmStatic + fun create(ops: List>) = RatMulExpr(ops.map { cast(it, Rat()) }) } - @Override - public RatLitExpr eval(final Valuation val) { - var prodNum = BigInteger.ONE; - var prodDenom = BigInteger.ONE; - for (final Expr op : getOps()) { - final RatLitExpr opLit = (RatLitExpr) op.eval(val); - prodNum = prodNum.multiply(opLit.getNum()); - prodDenom = prodDenom.multiply(opLit.getDenom()); + override val type: RatType = Rat() + override fun eval(`val`: Valuation): RatLitExpr { + var prodNum = BigInteger.ONE + var prodDenom = BigInteger.ONE + ops.forEach { op -> + val opVal = op.eval(`val`) as RatLitExpr + prodNum *= opVal.num + prodDenom *= opVal.denom } - return Rat(prodNum, prodDenom); + return Rat(prodNum, prodDenom) } - @Override - public RatMulExpr with(final Iterable> ops) { - if (ops == getOps()) { - return this; - } else { - return new RatMulExpr(ops); - } - } + override fun of(ops: List>): RatMulExpr = + Companion.of(ops) - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final RatMulExpr that = (RatMulExpr) obj; - return this.getOps().equals(that.getOps()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } + override val operatorLabel: String get() = OPERATOR_LABEL } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatNegExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatNegExpr.kt index d6ffa6537f..545d7c14db 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatNegExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatNegExpr.kt @@ -13,72 +13,38 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.rattype; -import static hu.bme.mit.theta.core.type.rattype.RatExprs.Rat; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; +package hu.bme.mit.theta.core.type.rattype -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.NegExpr; +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.NegExpr +import hu.bme.mit.theta.core.type.rattype.RatExprs.Rat +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -public final class RatNegExpr extends NegExpr { +@Serializable +@SerialName("RatNeg") +data class RatNegExpr( + override val op: Expr +) : NegExpr() { - private static final int HASH_SEED = 4127; - private static final String OPERATOR_LABEL = "-"; - - private RatNegExpr(final Expr op) { - super(op); - } - - public static RatNegExpr of(final Expr op) { - return new RatNegExpr(op); - } - - public static RatNegExpr create(final Expr op) { - final Expr newOp = cast(op, Rat()); - return RatNegExpr.of(newOp); - } - - @Override - public RatType getType() { - return Rat(); + companion object { + internal const val OPERATOR_LABEL = "-" + @JvmStatic + fun of(op: Expr) = RatNegExpr(op) + @JvmStatic + fun create(op: Expr<*>) = RatNegExpr(cast(op, Rat())) } - @Override - public RatLitExpr eval(final Valuation val) { - final RatLitExpr opVal = (RatLitExpr) getOp().eval(val); - return opVal.neg(); + override val type: RatType = Rat() + override fun eval(`val`: Valuation): RatLitExpr { + val opVal = op.eval(`val`) as RatLitExpr + return opVal.neg() } - @Override - public RatNegExpr with(final Expr op) { - if (op == getOp()) { - return this; - } else { - return RatNegExpr.of(op); - } - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final RatNegExpr that = (RatNegExpr) obj; - return this.getOp().equals(that.getOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } + override fun of(op: Expr): RatNegExpr = Companion.of(op) + override val operatorLabel: String get() = OPERATOR_LABEL } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatNeqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatNeqExpr.kt index 974061e667..3976d7b687 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatNeqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatNeqExpr.kt @@ -13,88 +13,43 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.rattype; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.type.rattype.RatExprs.Rat; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; +package hu.bme.mit.theta.core.type.rattype -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.NeqExpr; -import hu.bme.mit.theta.core.type.booltype.BoolLitExpr; -import hu.bme.mit.theta.core.type.booltype.BoolType; +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.NeqExpr +import hu.bme.mit.theta.core.type.booltype.BoolLitExpr +import hu.bme.mit.theta.core.type.rattype.RatExprs.Rat +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -public final class RatNeqExpr extends NeqExpr { +@Serializable +@SerialName("RatNeq") +data class RatNeqExpr( + override val leftOp: Expr, + override val rightOp: Expr +) : NeqExpr() { - private static final int HASH_SEED = 1997; - private static final String OPERATOR_LABEL = "/="; + companion object { - private RatNeqExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - } - - public static RatNeqExpr of(final Expr leftOp, final Expr rightOp) { - return new RatNeqExpr(leftOp, rightOp); - } - - public static RatNeqExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = cast(leftOp, Rat()); - final Expr newRightOp = cast(rightOp, Rat()); - return RatNeqExpr.of(newLeftOp, newRightOp); - } - - @Override - public BoolType getType() { - return Bool(); - } - - @Override - public BoolLitExpr eval(final Valuation val) { - final RatLitExpr leftOpVal = (RatLitExpr) getLeftOp().eval(val); - final RatLitExpr rightOpVal = (RatLitExpr) getRightOp().eval(val); - return leftOpVal.neq(rightOpVal); - } - - @Override - public RatNeqExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return RatNeqExpr.of(leftOp, rightOp); - } - } - - @Override - public RatNeqExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } + @JvmStatic + fun of(leftOp: Expr, rightOp: Expr) = RatNeqExpr(leftOp, rightOp) - @Override - public RatNeqExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = RatNeqExpr(cast(leftOp, Rat()), cast(rightOp, Rat())) } - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final RatNeqExpr that = (RatNeqExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } + override fun eval(`val`: Valuation): BoolLitExpr { + val leftOpVal = leftOp.eval(`val`) as RatLitExpr + val rightOpVal = rightOp.eval(`val`) as RatLitExpr + return leftOpVal.neq(rightOpVal) } - @Override - protected int getHashSeed() { - return HASH_SEED; - } + override fun of(leftOp: Expr, rightOp: Expr): RatNeqExpr = + Companion.of(leftOp, rightOp) - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } + override fun toString(): String = super.toString() } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatPosExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatPosExpr.kt index 62192436c7..767f7d3d4b 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatPosExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatPosExpr.kt @@ -13,72 +13,38 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.rattype; -import static hu.bme.mit.theta.core.type.rattype.RatExprs.Rat; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; +package hu.bme.mit.theta.core.type.rattype -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.PosExpr; +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.PosExpr +import hu.bme.mit.theta.core.type.rattype.RatExprs.Rat +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -public final class RatPosExpr extends PosExpr { +@Serializable +@SerialName("RatPos") +data class RatPosExpr( + override val op: Expr +) : PosExpr() { - private static final int HASH_SEED = 4827; - private static final String OPERATOR_LABEL = "+"; - - private RatPosExpr(final Expr op) { - super(op); - } - - public static RatPosExpr of(final Expr op) { - return new RatPosExpr(op); - } - - public static RatPosExpr create(final Expr op) { - final Expr newOp = cast(op, Rat()); - return RatPosExpr.of(newOp); - } - - @Override - public RatType getType() { - return Rat(); + companion object { + internal const val OPERATOR_LABEL = "+" + @JvmStatic + fun of(op: Expr) = RatPosExpr(op) + @JvmStatic + fun create(op: Expr<*>) = RatPosExpr(cast(op, Rat())) } - @Override - public RatLitExpr eval(final Valuation val) { - final RatLitExpr opVal = (RatLitExpr) getOp().eval(val); - return opVal.pos(); + override val type: RatType = Rat() + override fun eval(`val`: Valuation): RatLitExpr { + val opVal = op.eval(`val`) as RatLitExpr + return opVal.pos() } - @Override - public RatPosExpr with(final Expr op) { - if (op == getOp()) { - return this; - } else { - return RatPosExpr.of(op); - } - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final RatPosExpr that = (RatPosExpr) obj; - return this.getOp().equals(that.getOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } + override fun of(op: Expr): RatPosExpr = Companion.of(op) + override val operatorLabel: String get() = OPERATOR_LABEL } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatSubExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatSubExpr.kt index 805670f434..79ac6074c5 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatSubExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatSubExpr.kt @@ -13,85 +13,42 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.rattype; -import static hu.bme.mit.theta.core.type.rattype.RatExprs.Rat; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; +package hu.bme.mit.theta.core.type.rattype -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.SubExpr; +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.SubExpr +import hu.bme.mit.theta.core.type.rattype.RatExprs.Rat +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -public final class RatSubExpr extends SubExpr { +@Serializable +@SerialName("RatSub") +data class RatSubExpr( + override val leftOp: Expr, + override val rightOp: Expr +) : SubExpr() { - private static final int HASH_SEED = 6287; - private static final String OPERATOR = "-"; - - private RatSubExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - } - - public static RatSubExpr of(final Expr leftOp, final Expr rightOp) { - return new RatSubExpr(leftOp, rightOp); - } - - public static RatSubExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = cast(leftOp, Rat()); - final Expr newRightOp = cast(rightOp, Rat()); - return RatSubExpr.of(newLeftOp, newRightOp); - } - - @Override - public RatType getType() { - return Rat(); - } - - @Override - public RatLitExpr eval(final Valuation val) { - final RatLitExpr leftOpVal = (RatLitExpr) getLeftOp().eval(val); - final RatLitExpr rightOpVal = (RatLitExpr) getRightOp().eval(val); - return leftOpVal.sub(rightOpVal); + companion object { + internal const val OPERATOR_LABEL = "-" + @JvmStatic + fun of(leftOp: Expr, rightOp: Expr) = RatSubExpr(leftOp, rightOp) + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = RatSubExpr(cast(leftOp, Rat()), cast(rightOp, Rat())) } - @Override - public SubExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return RatSubExpr.of(leftOp, rightOp); - } + override val type: RatType = Rat() + override fun eval(`val`: Valuation): RatLitExpr { + val leftOpVal = leftOp.eval(`val`) as RatLitExpr + val rightOpVal = rightOp.eval(`val`) as RatLitExpr + return leftOpVal.sub(rightOpVal) } - @Override - public SubExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } - - @Override - public SubExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final RatSubExpr that = (RatSubExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } + override fun of(leftOp: Expr, rightOp: Expr): RatSubExpr = + Companion.of(leftOp, rightOp) - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR; - } + override val operatorLabel: String get() = OPERATOR_LABEL } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatToIntExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatToIntExpr.kt index 90648969c4..ce513d756d 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatToIntExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatToIntExpr.kt @@ -13,75 +13,45 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.rattype; -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; -import static hu.bme.mit.theta.core.type.rattype.RatExprs.Rat; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; +package hu.bme.mit.theta.core.type.rattype -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.UnaryExpr; -import hu.bme.mit.theta.core.type.inttype.IntLitExpr; -import hu.bme.mit.theta.core.type.inttype.IntType; +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.UnaryExpr +import hu.bme.mit.theta.core.type.inttype.IntExprs.Int +import hu.bme.mit.theta.core.type.inttype.IntLitExpr +import hu.bme.mit.theta.core.type.inttype.IntType +import hu.bme.mit.theta.core.type.rattype.RatExprs.Rat +import hu.bme.mit.theta.core.utils.TypeUtils.cast +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -public final class RatToIntExpr extends UnaryExpr { +@Serializable +@SerialName("RatToInt") +data class RatToIntExpr( + override val op: Expr +) : UnaryExpr() { - private static final int HASH_SEED = 4828; - private static final String OPERATOR_LABEL = "to_int"; + companion object { - private RatToIntExpr(final Expr op) { - super(op); - } - - public static RatToIntExpr of(final Expr op) { - return new RatToIntExpr(op); - } - - public static RatToIntExpr create(final Expr op) { - final Expr newOp = cast(op, Rat()); - return RatToIntExpr.of(newOp); - } - - @Override - public IntType getType() { - return Int(); - } - - @Override - public IntLitExpr eval(final Valuation val) { - final RatLitExpr opVal = (RatLitExpr) getOp().eval(val); - return opVal.toInt(); - } + internal const val OPERATOR_LABEL = "to_int" - @Override - public RatToIntExpr with(final Expr op) { - if (op == getOp()) { - return this; - } else { - return RatToIntExpr.of(op); - } - } + @JvmStatic + fun of(op: Expr) = RatToIntExpr(op) - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final RatToIntExpr that = (RatToIntExpr) obj; - return this.getOp().equals(that.getOp()); - } else { - return false; - } + @JvmStatic + fun create(op: Expr<*>) = RatToIntExpr(cast(op, Rat())) } - @Override - protected int getHashSeed() { - return HASH_SEED; + override val type: IntType = Int() + override val operatorLabel: String get() = OPERATOR_LABEL + override fun eval(`val`: Valuation): IntLitExpr { + val opVal = op.eval(`val`) as RatLitExpr + return opVal.toInt() } - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } + override fun of(op: Expr): RatToIntExpr = Companion.of(op) + override fun toString(): String = super.toString() } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatType.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatType.kt index 5495c56d3e..67191fc115 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatType.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatType.kt @@ -1,122 +1,36 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.rattype; -import hu.bme.mit.theta.core.type.DomainSize; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.Additive; -import hu.bme.mit.theta.core.type.abstracttype.Equational; -import hu.bme.mit.theta.core.type.abstracttype.Multiplicative; -import hu.bme.mit.theta.core.type.abstracttype.Ordered; - -public final class RatType - implements Additive, - Multiplicative, - Equational, - Ordered { - - private static final RatType INSTANCE = new RatType(); - private static final int HASH_SEED = 385863; - private static final String TYPE_LABEL = "Rat"; - - private RatType() {} - - public static RatType getInstance() { - return INSTANCE; - } - - @Override - public int hashCode() { - return HASH_SEED; - } - - @Override - public boolean equals(final Object obj) { - return (obj != null && this.getClass() == obj.getClass()); - } - - @Override - public String toString() { - return TYPE_LABEL; - } - - //// - - @Override - public RatAddExpr Add(final Iterable> ops) { - return RatExprs.Add(ops); - } - - @Override - public RatSubExpr Sub(final Expr leftOp, final Expr rightOp) { - return RatExprs.Sub(leftOp, rightOp); - } - - @Override - public RatPosExpr Pos(final Expr op) { - return RatExprs.Pos(op); - } - - @Override - public RatNegExpr Neg(final Expr op) { - return RatExprs.Neg(op); - } - - @Override - public RatMulExpr Mul(final Iterable> ops) { - return RatExprs.Mul(ops); - } - - @Override - public RatDivExpr Div(final Expr leftOp, final Expr rightOp) { - return RatExprs.Div(leftOp, rightOp); - } - - @Override - public RatEqExpr Eq(final Expr leftOp, final Expr rightOp) { - return RatExprs.Eq(leftOp, rightOp); - } - - @Override - public RatNeqExpr Neq(final Expr leftOp, final Expr rightOp) { - return RatExprs.Neq(leftOp, rightOp); - } - - @Override - public RatLtExpr Lt(final Expr leftOp, final Expr rightOp) { - return RatExprs.Lt(leftOp, rightOp); - } - - @Override - public RatLeqExpr Leq(final Expr leftOp, final Expr rightOp) { - return RatExprs.Leq(leftOp, rightOp); - } - - @Override - public RatGtExpr Gt(final Expr leftOp, final Expr rightOp) { - return RatExprs.Gt(leftOp, rightOp); - } - - @Override - public RatGeqExpr Geq(final Expr leftOp, final Expr rightOp) { - return RatExprs.Geq(leftOp, rightOp); - } - - @Override - public DomainSize getDomainSize() { - return DomainSize.INFINITY; - } +package hu.bme.mit.theta.core.type.rattype + +import hu.bme.mit.theta.core.type.DomainSize +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.Type +import hu.bme.mit.theta.core.type.abstracttype.Additive +import hu.bme.mit.theta.core.type.abstracttype.Equational +import hu.bme.mit.theta.core.type.abstracttype.Multiplicative +import hu.bme.mit.theta.core.type.abstracttype.Ordered +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName(RatType.TYPE_LABEL) +object RatType : Additive, Multiplicative, Equational, Ordered, Type { + internal const val TYPE_LABEL = "Rat" + @JvmStatic + fun getInstance(): RatType = this + override fun toString(): String = TYPE_LABEL + + override fun Add(ops: Iterable>) = RatAddExpr.of(ops) + override fun Sub(leftOp: Expr, rightOp: Expr) = RatSubExpr(leftOp, rightOp) + override fun Pos(op: Expr) = RatPosExpr(op) + override fun Neg(op: Expr) = RatNegExpr(op) + override fun Mul(ops: Iterable>) = RatMulExpr.of(ops) + override fun Div(leftOp: Expr, rightOp: Expr) = RatDivExpr(leftOp, rightOp) + override fun Eq(leftOp: Expr, rightOp: Expr) = RatEqExpr(leftOp, rightOp) + override fun Neq(leftOp: Expr, rightOp: Expr) = RatNeqExpr(leftOp, rightOp) + override fun Lt(leftOp: Expr, rightOp: Expr) = RatLtExpr(leftOp, rightOp) + override fun Leq(leftOp: Expr, rightOp: Expr) = RatLeqExpr(leftOp, rightOp) + override fun Gt(leftOp: Expr, rightOp: Expr) = RatGtExpr(leftOp, rightOp) + override fun Geq(leftOp: Expr, rightOp: Expr) = RatGeqExpr(leftOp, rightOp) + + override val domainSize: DomainSize = DomainSize.INFINITY } From 40b723d266bacc954140e5140614d695397ae271 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Csan=C3=A1d=20Telbisz?= Date: Tue, 24 Jun 2025 11:29:42 +0200 Subject: [PATCH 19/48] Rename .java to .kt --- .../mit/theta/core/type/bvtype/{BvAddExpr.java => BvAddExpr.kt} | 0 .../mit/theta/core/type/bvtype/{BvAndExpr.java => BvAndExpr.kt} | 0 .../{BvArithShiftRightExpr.java => BvArithShiftRightExpr.kt} | 0 .../theta/core/type/bvtype/{BvConcatExpr.java => BvConcatExpr.kt} | 0 .../bme/mit/theta/core/type/bvtype/{BvEqExpr.java => BvEqExpr.kt} | 0 .../bme/mit/theta/core/type/bvtype/{BvExprs.java => BvExprs.kt} | 0 .../core/type/bvtype/{BvExtractExpr.java => BvExtractExpr.kt} | 0 .../mit/theta/core/type/bvtype/{BvLitExpr.java => BvLitExpr.kt} | 0 .../{BvLogicShiftRightExpr.java => BvLogicShiftRightExpr.kt} | 0 .../mit/theta/core/type/bvtype/{BvMulExpr.java => BvMulExpr.kt} | 0 .../mit/theta/core/type/bvtype/{BvNegExpr.java => BvNegExpr.kt} | 0 .../mit/theta/core/type/bvtype/{BvNeqExpr.java => BvNeqExpr.kt} | 0 .../mit/theta/core/type/bvtype/{BvNotExpr.java => BvNotExpr.kt} | 0 .../bme/mit/theta/core/type/bvtype/{BvOrExpr.java => BvOrExpr.kt} | 0 .../mit/theta/core/type/bvtype/{BvPosExpr.java => BvPosExpr.kt} | 0 .../type/bvtype/{BvRotateLeftExpr.java => BvRotateLeftExpr.kt} | 0 .../type/bvtype/{BvRotateRightExpr.java => BvRotateRightExpr.kt} | 0 .../mit/theta/core/type/bvtype/{BvSDivExpr.java => BvSDivExpr.kt} | 0 .../mit/theta/core/type/bvtype/{BvSExtExpr.java => BvSExtExpr.kt} | 0 .../mit/theta/core/type/bvtype/{BvSGeqExpr.java => BvSGeqExpr.kt} | 0 .../mit/theta/core/type/bvtype/{BvSGtExpr.java => BvSGtExpr.kt} | 0 .../mit/theta/core/type/bvtype/{BvSLeqExpr.java => BvSLeqExpr.kt} | 0 .../mit/theta/core/type/bvtype/{BvSLtExpr.java => BvSLtExpr.kt} | 0 .../mit/theta/core/type/bvtype/{BvSModExpr.java => BvSModExpr.kt} | 0 .../mit/theta/core/type/bvtype/{BvSRemExpr.java => BvSRemExpr.kt} | 0 .../core/type/bvtype/{BvShiftLeftExpr.java => BvShiftLeftExpr.kt} | 0 .../type/bvtype/{BvSignChangeExpr.java => BvSignChangeExpr.kt} | 0 .../mit/theta/core/type/bvtype/{BvSubExpr.java => BvSubExpr.kt} | 0 .../hu/bme/mit/theta/core/type/bvtype/{BvType.java => BvType.kt} | 0 .../mit/theta/core/type/bvtype/{BvUDivExpr.java => BvUDivExpr.kt} | 0 .../mit/theta/core/type/bvtype/{BvUGeqExpr.java => BvUGeqExpr.kt} | 0 .../mit/theta/core/type/bvtype/{BvUGtExpr.java => BvUGtExpr.kt} | 0 .../mit/theta/core/type/bvtype/{BvULeqExpr.java => BvULeqExpr.kt} | 0 .../mit/theta/core/type/bvtype/{BvULtExpr.java => BvULtExpr.kt} | 0 .../mit/theta/core/type/bvtype/{BvURemExpr.java => BvURemExpr.kt} | 0 .../mit/theta/core/type/bvtype/{BvXorExpr.java => BvXorExpr.kt} | 0 .../mit/theta/core/type/bvtype/{BvZExtExpr.java => BvZExtExpr.kt} | 0 37 files changed, 0 insertions(+), 0 deletions(-) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/{BvAddExpr.java => BvAddExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/{BvAndExpr.java => BvAndExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/{BvArithShiftRightExpr.java => BvArithShiftRightExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/{BvConcatExpr.java => BvConcatExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/{BvEqExpr.java => BvEqExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/{BvExprs.java => BvExprs.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/{BvExtractExpr.java => BvExtractExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/{BvLitExpr.java => BvLitExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/{BvLogicShiftRightExpr.java => BvLogicShiftRightExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/{BvMulExpr.java => BvMulExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/{BvNegExpr.java => BvNegExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/{BvNeqExpr.java => BvNeqExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/{BvNotExpr.java => BvNotExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/{BvOrExpr.java => BvOrExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/{BvPosExpr.java => BvPosExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/{BvRotateLeftExpr.java => BvRotateLeftExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/{BvRotateRightExpr.java => BvRotateRightExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/{BvSDivExpr.java => BvSDivExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/{BvSExtExpr.java => BvSExtExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/{BvSGeqExpr.java => BvSGeqExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/{BvSGtExpr.java => BvSGtExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/{BvSLeqExpr.java => BvSLeqExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/{BvSLtExpr.java => BvSLtExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/{BvSModExpr.java => BvSModExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/{BvSRemExpr.java => BvSRemExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/{BvShiftLeftExpr.java => BvShiftLeftExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/{BvSignChangeExpr.java => BvSignChangeExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/{BvSubExpr.java => BvSubExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/{BvType.java => BvType.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/{BvUDivExpr.java => BvUDivExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/{BvUGeqExpr.java => BvUGeqExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/{BvUGtExpr.java => BvUGtExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/{BvULeqExpr.java => BvULeqExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/{BvULtExpr.java => BvULtExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/{BvURemExpr.java => BvURemExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/{BvXorExpr.java => BvXorExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/{BvZExtExpr.java => BvZExtExpr.kt} (100%) diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvAddExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvAddExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvAddExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvAddExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvAndExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvAndExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvAndExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvAndExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvArithShiftRightExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvArithShiftRightExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvArithShiftRightExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvArithShiftRightExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvConcatExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvConcatExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvConcatExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvConcatExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvEqExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvEqExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvEqExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvEqExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvExprs.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvExprs.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvExprs.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvExprs.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvExtractExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvExtractExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvExtractExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvExtractExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvLitExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvLitExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvLitExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvLitExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvLogicShiftRightExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvLogicShiftRightExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvLogicShiftRightExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvLogicShiftRightExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvMulExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvMulExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvMulExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvMulExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvNegExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvNegExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvNegExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvNegExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvNeqExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvNeqExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvNeqExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvNeqExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvNotExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvNotExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvNotExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvNotExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvOrExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvOrExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvOrExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvOrExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvPosExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvPosExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvPosExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvPosExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvRotateLeftExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvRotateLeftExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvRotateLeftExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvRotateLeftExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvRotateRightExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvRotateRightExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvRotateRightExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvRotateRightExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSDivExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSDivExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSDivExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSDivExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSExtExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSExtExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSExtExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSExtExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSGeqExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSGeqExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSGeqExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSGeqExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSGtExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSGtExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSGtExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSGtExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSLeqExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSLeqExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSLeqExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSLeqExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSLtExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSLtExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSLtExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSLtExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSModExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSModExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSModExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSModExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSRemExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSRemExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSRemExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSRemExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvShiftLeftExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvShiftLeftExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvShiftLeftExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvShiftLeftExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSignChangeExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSignChangeExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSignChangeExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSignChangeExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSubExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSubExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSubExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSubExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvType.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvType.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvType.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvType.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvUDivExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvUDivExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvUDivExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvUDivExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvUGeqExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvUGeqExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvUGeqExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvUGeqExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvUGtExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvUGtExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvUGtExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvUGtExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvULeqExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvULeqExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvULeqExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvULeqExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvULtExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvULtExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvULtExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvULtExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvURemExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvURemExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvURemExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvURemExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvXorExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvXorExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvXorExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvXorExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvZExtExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvZExtExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvZExtExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvZExtExpr.kt From 6776a6752b2a6ec54fc6a83a28b349c91c950938 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Csan=C3=A1d=20Telbisz?= Date: Tue, 24 Jun 2025 11:29:43 +0200 Subject: [PATCH 20/48] convert to serializable - bvtype --- .../mit/theta/core/type/anytype/PrimeExpr.kt | 2 +- .../mit/theta/core/type/bvtype/BvAddExpr.kt | 88 +-- .../mit/theta/core/type/bvtype/BvAndExpr.kt | 87 +-- .../core/type/bvtype/BvArithShiftRightExpr.kt | 96 +-- .../theta/core/type/bvtype/BvConcatExpr.kt | 111 +--- .../mit/theta/core/type/bvtype/BvEqExpr.kt | 103 +--- .../bme/mit/theta/core/type/bvtype/BvExprs.kt | 221 +++---- .../theta/core/type/bvtype/BvExtractExpr.kt | 183 ++---- .../mit/theta/core/type/bvtype/BvLitExpr.kt | 566 ++++++++---------- .../core/type/bvtype/BvLogicShiftRightExpr.kt | 97 +-- .../mit/theta/core/type/bvtype/BvMulExpr.kt | 87 +-- .../mit/theta/core/type/bvtype/BvNegExpr.kt | 79 +-- .../mit/theta/core/type/bvtype/BvNeqExpr.kt | 103 +--- .../mit/theta/core/type/bvtype/BvNotExpr.kt | 79 +-- .../mit/theta/core/type/bvtype/BvOrExpr.kt | 87 +-- .../mit/theta/core/type/bvtype/BvPosExpr.kt | 79 +-- .../core/type/bvtype/BvRotateLeftExpr.kt | 97 +-- .../core/type/bvtype/BvRotateRightExpr.kt | 97 +-- .../mit/theta/core/type/bvtype/BvSDivExpr.kt | 115 +--- .../mit/theta/core/type/bvtype/BvSExtExpr.kt | 131 ++-- .../mit/theta/core/type/bvtype/BvSGeqExpr.kt | 104 +--- .../mit/theta/core/type/bvtype/BvSGtExpr.kt | 103 +--- .../mit/theta/core/type/bvtype/BvSLeqExpr.kt | 103 +--- .../mit/theta/core/type/bvtype/BvSLtExpr.kt | 103 +--- .../mit/theta/core/type/bvtype/BvSModExpr.kt | 113 +--- .../mit/theta/core/type/bvtype/BvSRemExpr.kt | 115 +--- .../theta/core/type/bvtype/BvShiftLeftExpr.kt | 97 +-- .../core/type/bvtype/BvSignChangeExpr.kt | 86 +-- .../mit/theta/core/type/bvtype/BvSubExpr.kt | 97 +-- .../bme/mit/theta/core/type/bvtype/BvType.kt | 234 ++------ .../mit/theta/core/type/bvtype/BvUDivExpr.kt | 116 +--- .../mit/theta/core/type/bvtype/BvUGeqExpr.kt | 102 +--- .../mit/theta/core/type/bvtype/BvUGtExpr.kt | 103 +--- .../mit/theta/core/type/bvtype/BvULeqExpr.kt | 103 +--- .../mit/theta/core/type/bvtype/BvULtExpr.kt | 104 +--- .../mit/theta/core/type/bvtype/BvURemExpr.kt | 115 +--- .../mit/theta/core/type/bvtype/BvXorExpr.kt | 87 +-- .../mit/theta/core/type/bvtype/BvZExtExpr.kt | 130 ++-- .../mit/theta/core/type/rattype/RatDivExpr.kt | 2 +- .../mit/theta/core/type/rattype/RatMulExpr.kt | 2 +- .../mit/theta/core/type/rattype/RatNegExpr.kt | 2 +- .../mit/theta/core/type/rattype/RatPosExpr.kt | 2 +- .../mit/theta/core/type/rattype/RatSubExpr.kt | 2 +- .../theta/core/type/rattype/RatToIntExpr.kt | 2 +- 44 files changed, 1417 insertions(+), 3118 deletions(-) diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/PrimeExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/PrimeExpr.kt index bfa1a0dfcb..a708a51097 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/PrimeExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/PrimeExpr.kt @@ -36,7 +36,7 @@ data class PrimeExpr( companion object { - internal const val OPERATOR_LABEL = "prime" + private const val OPERATOR_LABEL = "prime" @JvmStatic fun of(op: Expr): PrimeExpr = PrimeExpr(op) } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvAddExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvAddExpr.kt index 35e52f87e8..86d2d351bb 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvAddExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvAddExpr.kt @@ -13,80 +13,42 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.bvtype; -import static com.google.common.base.Preconditions.checkNotNull; -import static com.google.common.collect.ImmutableList.toImmutableList; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; +package hu.bme.mit.theta.core.type.bvtype -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.AddExpr; -import hu.bme.mit.theta.core.utils.TypeUtils; -import java.util.List; +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.AddExpr +import hu.bme.mit.theta.core.utils.TypeUtils +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -public final class BvAddExpr extends AddExpr { +@Serializable +@SerialName("BvAdd") +data class BvAddExpr( + override val ops: List> +) : AddExpr() { - private static final int HASH_SEED = 6586; - private static final String OPERATOR_LABEL = "bvadd"; + companion object { + private const val OPERATOR_LABEL = "bvadd" - private BvAddExpr(final Iterable> ops) { - super(ops); - checkAllTypesEqual(ops); - } - - public static BvAddExpr of(final Iterable> ops) { - return new BvAddExpr(ops); - } - - public static BvAddExpr create(final List> ops) { - checkNotNull(ops); - return BvAddExpr.of(ops.stream().map(TypeUtils::castBv).collect(toImmutableList())); - } + @JvmStatic + fun of(ops: Iterable>) = BvAddExpr(ops.toList()) - @Override - public BvType getType() { - return getOps().get(0).getType(); + @JvmStatic + fun create(ops: List>) = BvAddExpr(ops.map { TypeUtils.castBv(it) }) } - @Override - public BvLitExpr eval(final Valuation val) { - return getOps().stream() - .skip(1) - .reduce( - (BvLitExpr) getOps().get(0).eval(val), - (op1, op2) -> (op1.add((BvLitExpr) op2.eval(val))), - BvLitExpr::add); - } + override val type: BvType get() = ops[0].type - @Override - public BvAddExpr with(final Iterable> ops) { - if (ops == getOps()) { - return this; - } else { - return BvAddExpr.of(ops); - } + override fun eval(`val`: Valuation): BvLitExpr = ops.drop(1).fold(ops[0].eval(`val`) as BvLitExpr) { acc, op -> + acc.add(op.eval(`val`) as BvLitExpr) } - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final BvAddExpr that = (BvAddExpr) obj; - return this.getOps().equals(that.getOps()); - } else { - return false; - } - } + override fun of(ops: List>): BvAddExpr = Companion.of(ops) - @Override - protected int getHashSeed() { - return HASH_SEED; - } + override val operatorLabel: String get() = OPERATOR_LABEL - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } + override fun toString(): String = super.toString() } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvAndExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvAndExpr.kt index 9139a6a705..f9bd2b4522 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvAndExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvAndExpr.kt @@ -13,80 +13,41 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.bvtype; -import static com.google.common.base.Preconditions.checkNotNull; -import static com.google.common.collect.ImmutableList.toImmutableList; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; +package hu.bme.mit.theta.core.type.bvtype -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.MultiaryExpr; -import hu.bme.mit.theta.core.utils.TypeUtils; -import java.util.List; +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.MultiaryExpr +import hu.bme.mit.theta.core.utils.TypeUtils +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -public final class BvAndExpr extends MultiaryExpr { +@Serializable +@SerialName("BvAnd") +data class BvAndExpr( + override val ops: List> +) : MultiaryExpr() { - private static final int HASH_SEED = 9125; - private static final String OPERATOR_LABEL = "bvand"; + companion object { + private const val OPERATOR_LABEL = "bvand" - private BvAndExpr(final Iterable> ops) { - super(ops); - checkAllTypesEqual(ops); - } + @JvmStatic + fun of(ops: Iterable>) = BvAndExpr(ops.toList()) - public static BvAndExpr of(final Iterable> ops) { - return new BvAndExpr(ops); + @JvmStatic + fun create(ops: List>) = BvAndExpr(ops.map { TypeUtils.castBv(it) }) } - public static BvAndExpr create(final List> ops) { - checkNotNull(ops); - return BvAndExpr.of(ops.stream().map(TypeUtils::castBv).collect(toImmutableList())); - } + override val type: BvType get() = ops[0].type - @Override - public BvType getType() { - return getOps().get(0).getType(); + override fun eval(`val`: Valuation): BvLitExpr = ops.drop(1).fold(ops[0].eval(`val`) as BvLitExpr) { acc, op -> + acc.and(op.eval(`val`) as BvLitExpr) } - @Override - public BvLitExpr eval(final Valuation val) { - return getOps().stream() - .skip(1) - .reduce( - (BvLitExpr) getOps().get(0).eval(val), - (op1, op2) -> (op1.and((BvLitExpr) op2.eval(val))), - BvLitExpr::and); - } + override fun of(ops: List>): BvAndExpr = Companion.of(ops) - @Override - public BvAndExpr with(final Iterable> ops) { - if (ops == getOps()) { - return this; - } else { - return BvAndExpr.of(ops); - } - } + override val operatorLabel: String get() = OPERATOR_LABEL - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final BvAndExpr that = (BvAndExpr) obj; - return this.getOps().equals(that.getOps()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } + override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvArithShiftRightExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvArithShiftRightExpr.kt index 8b7c7130b6..3b2b33e84e 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvArithShiftRightExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvArithShiftRightExpr.kt @@ -13,86 +13,44 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.bvtype; -import static hu.bme.mit.theta.core.utils.TypeUtils.castBv; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; +package hu.bme.mit.theta.core.type.bvtype -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.BinaryExpr; -import hu.bme.mit.theta.core.type.Expr; +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.BinaryExpr +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.utils.TypeUtils +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -public final class BvArithShiftRightExpr extends BinaryExpr { +@Serializable +@SerialName("BvArithShiftRight") +data class BvArithShiftRightExpr( + override val leftOp: Expr, + override val rightOp: Expr +) : BinaryExpr() { - private static final int HASH_SEED = 965; - private static final String OPERATOR_LABEL = "bvashr"; + companion object { + private const val OPERATOR_LABEL = "bvashr" - private BvArithShiftRightExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - checkAllTypesEqual(leftOp, rightOp); - } + @JvmStatic + fun of(leftOp: Expr, rightOp: Expr) = BvArithShiftRightExpr(leftOp, rightOp) - public static BvArithShiftRightExpr of(final Expr leftOp, final Expr rightOp) { - return new BvArithShiftRightExpr(leftOp, rightOp); + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = BvArithShiftRightExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) } - public static BvArithShiftRightExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = castBv(leftOp); - final Expr newRightOp = castBv(rightOp); - return BvArithShiftRightExpr.of(newLeftOp, newRightOp); - } + override val type: BvType get() = leftOp.type - @Override - public BvType getType() { - return getOps().get(0).getType(); + override fun eval(`val`: Valuation): BvLitExpr { + val leftOpVal = leftOp.eval(`val`) as BvLitExpr + val rightOpVal = rightOp.eval(`val`) as BvLitExpr + return leftOpVal.arithShiftRight(rightOpVal) } - @Override - public BvLitExpr eval(final Valuation val) { - final BvLitExpr leftOpVal = (BvLitExpr) getLeftOp().eval(val); - final BvLitExpr rightOpVal = (BvLitExpr) getRightOp().eval(val); - return leftOpVal.arithShiftRight(rightOpVal); - } + override fun of(leftOp: Expr, rightOp: Expr): BvArithShiftRightExpr = Companion.of(leftOp, rightOp) - @Override - public BvArithShiftRightExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return BvArithShiftRightExpr.of(leftOp, rightOp); - } - } + override val operatorLabel: String get() = OPERATOR_LABEL - @Override - public BvArithShiftRightExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } - - @Override - public BvArithShiftRightExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final BvArithShiftRightExpr that = (BvArithShiftRightExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } + override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvConcatExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvConcatExpr.kt index c8797e8c4b..264e9f9ae1 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvConcatExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvConcatExpr.kt @@ -13,101 +13,38 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.bvtype; -import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.base.Preconditions.checkNotNull; -import static com.google.common.collect.ImmutableList.toImmutableList; +package hu.bme.mit.theta.core.type.bvtype -import com.google.common.collect.ImmutableList; -import hu.bme.mit.theta.common.Utils; -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.utils.TypeUtils; -import java.util.List; +import hu.bme.mit.theta.common.Utils +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.utils.TypeUtils +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -public final class BvConcatExpr implements Expr { +@Serializable +@SerialName("BvConcat") +data class BvConcatExpr( + override val ops: List> +) : Expr { - private static final int HASH_SEED = 8264; - private static final String OPERATOR_LABEL = "++"; + companion object { - private final List> ops; + private const val OPERATOR_LABEL = "++" - private volatile int hashCode = 0; + @JvmStatic + fun of(ops: Iterable>) = BvConcatExpr(ops.toList()) - private BvConcatExpr(final Iterable> ops) { - checkNotNull(ops); - checkArgument(ops.iterator().hasNext()); - this.ops = ImmutableList.copyOf(ops); + @JvmStatic + fun create(ops: List>) = BvConcatExpr(ops.map { TypeUtils.castBv(it) }) } - public static BvConcatExpr of(final Iterable> ops) { - return new BvConcatExpr(ops); - } - - public static BvConcatExpr create(final List> ops) { - checkNotNull(ops); - return BvConcatExpr.of(ops.stream().map(TypeUtils::castBv).collect(toImmutableList())); - } - - @Override - public int getArity() { - return ops.size(); - } - - @Override - public BvType getType() { - return BvType.of(ops.stream().map(o -> o.getType().getSize()).reduce(0, Integer::sum)); - } - - @Override - public BvLitExpr eval(final Valuation val) { - return getOps().stream() - .skip(1) - .reduce( - (BvLitExpr) getOps().get(0).eval(val), - (op1, op2) -> (op1.concat((BvLitExpr) op2.eval(val))), - BvLitExpr::concat); - } - - @Override - public List> getOps() { - return ops; - } - - @Override - public Expr withOps(List> ops) { - checkNotNull(ops); - checkArgument(ops.size() >= 1); - - return of(ops.stream().map(TypeUtils::castBv).collect(toImmutableList())); - } - - @Override - public int hashCode() { - int result = hashCode; - if (result == 0) { - result = HASH_SEED; - result = 31 * result + getOps().hashCode(); - hashCode = result; - } - return result; - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final BvConcatExpr that = (BvConcatExpr) obj; - return this.getOps().equals(that.getOps()); - } else { - return false; - } - } + override val type: BvType = BvType.of(ops.sumOf { it.type.size }) + override fun eval(`val`: Valuation): BvLitExpr = + ops.drop(1).fold(ops[0].eval(`val`) as BvLitExpr) { acc, op -> acc.concat(op.eval(`val`) as BvLitExpr) } - @Override - public String toString() { - return Utils.lispStringBuilder(OPERATOR_LABEL).body().addAll(getOps()).toString(); - } + override fun withOps(ops: List>): Expr = of(ops.map { TypeUtils.castBv(it) }) + override fun toString(): String = Utils.lispStringBuilder(OPERATOR_LABEL).body().addAll(ops).toString() } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvEqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvEqExpr.kt index 9accdbc1ec..948394c69d 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvEqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvEqExpr.kt @@ -13,90 +13,47 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.bvtype; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.utils.TypeUtils.castBv; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; +package hu.bme.mit.theta.core.type.bvtype -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.EqExpr; -import hu.bme.mit.theta.core.type.booltype.BoolLitExpr; -import hu.bme.mit.theta.core.type.booltype.BoolType; +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.EqExpr +import hu.bme.mit.theta.core.type.booltype.BoolLitExpr +import hu.bme.mit.theta.core.type.booltype.BoolType +import hu.bme.mit.theta.core.type.booltype.BoolExprs +import hu.bme.mit.theta.core.utils.TypeUtils +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -public final class BvEqExpr extends EqExpr { +@Serializable +@SerialName("BvEq") +data class BvEqExpr( + override val leftOp: Expr, + override val rightOp: Expr +) : EqExpr() { - private static final int HASH_SEED = 2487; - private static final String OPERATOR_LABEL = "="; + companion object { + private const val OPERATOR_LABEL = "=" - private BvEqExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - checkAllTypesEqual(leftOp, rightOp); - } - - public static BvEqExpr of(final Expr leftOp, final Expr rightOp) { - return new BvEqExpr(leftOp, rightOp); - } - - public static BvEqExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = castBv(leftOp); - final Expr newRightOp = castBv(rightOp); - return BvEqExpr.of(newLeftOp, newRightOp); - } - - @Override - public BoolType getType() { - return Bool(); - } + @JvmStatic + fun of(leftOp: Expr, rightOp: Expr) = BvEqExpr(leftOp, rightOp) - @Override - public BoolLitExpr eval(final Valuation val) { - final BvLitExpr leftOpVal = (BvLitExpr) getLeftOp().eval(val); - final BvLitExpr rightOpVal = (BvLitExpr) getRightOp().eval(val); - - return leftOpVal.eq(rightOpVal); + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = BvEqExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) } - @Override - public BvEqExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return BvEqExpr.of(leftOp, rightOp); - } - } + override val type: BoolType get() = BoolExprs.Bool() - @Override - public BvEqExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); + override fun eval(`val`: Valuation): BoolLitExpr { + val leftOpVal = leftOp.eval(`val`) as BvLitExpr + val rightOpVal = rightOp.eval(`val`) as BvLitExpr + return leftOpVal.eq(rightOpVal) } - @Override - public BvEqExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } + override fun of(leftOp: Expr, rightOp: Expr): BvEqExpr = Companion.of(leftOp, rightOp) - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final BvEqExpr that = (BvEqExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } + override val operatorLabel: String get() = OPERATOR_LABEL - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } + override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvExprs.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvExprs.kt index 56e1358f5d..c1a50236b4 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvExprs.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvExprs.kt @@ -13,166 +13,117 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.bvtype; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.inttype.IntLitExpr; -import java.util.List; +package hu.bme.mit.theta.core.type.bvtype -public final class BvExprs { +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.inttype.IntLitExpr - private BvExprs() {} +@Suppress("FunctionName") +object BvExprs { - public static BvType BvType(final int size, final Boolean signedness) { - return BvType.of(size, signedness); - } + @JvmStatic + fun BvType(size: Int, signedness: Boolean? = null) = BvType.of(size, signedness) - public static BvType BvType(final int size) { - return BvType(size, null); - } + @JvmStatic + fun Bv(value: BooleanArray, signedness: Boolean? = null) = BvLitExpr(value, signedness) - public static BvLitExpr Bv(final boolean[] value, final Boolean signedness) { - return BvLitExpr.of(value, signedness); - } + @JvmStatic + fun Concat(ops: Iterable>) = BvConcatExpr.of(ops) - public static BvLitExpr Bv(final boolean[] value) { - return Bv(value, null); - } + @JvmStatic + fun Extract(bitvec: Expr, from: IntLitExpr, until: IntLitExpr) = BvExtractExpr(bitvec, from, until) - public static BvConcatExpr Concat(final Iterable> ops) { - return BvConcatExpr.of(ops); - } + @JvmStatic + fun ZExt(bitvec: Expr, extendType: BvType) = BvZExtExpr(bitvec, extendType) - public static BvExtractExpr Extract( - final Expr bitvec, final IntLitExpr from, final IntLitExpr until) { - return BvExtractExpr.of(bitvec, from, until); - } + @JvmStatic + fun SExt(bitvec: Expr, extendType: BvType) = BvSExtExpr(bitvec, extendType) - public static BvZExtExpr ZExt(final Expr bitvec, final BvType extendType) { - return BvZExtExpr.of(bitvec, extendType); - } + @JvmStatic + fun Add(ops: Iterable>) = BvAddExpr.of(ops) - public static BvSExtExpr SExt(final Expr bitvec, final BvType extendType) { - return BvSExtExpr.of(bitvec, extendType); - } + @JvmStatic + fun Sub(leftOp: Expr, rightOp: Expr) = BvSubExpr(leftOp, rightOp) - public static BvAddExpr Add(final Iterable> ops) { - return BvAddExpr.of(ops); - } + @JvmStatic + fun Pos(op: Expr) = BvPosExpr(op) - public static BvSubExpr Sub(final Expr leftOp, final Expr rightOp) { - return BvSubExpr.of(leftOp, rightOp); - } + @JvmStatic + fun Neg(op: Expr) = BvNegExpr(op) - public static BvPosExpr Pos(final Expr op) { - return BvPosExpr.of(op); - } + @JvmStatic + fun Mul(ops: Iterable>) = BvMulExpr.of(ops) - public static BvNegExpr Neg(final Expr op) { - return BvNegExpr.of(op); - } + @JvmStatic + fun UDiv(leftOp: Expr, rightOp: Expr) = BvUDivExpr(leftOp, rightOp) - public static BvMulExpr Mul(final Iterable> ops) { - return BvMulExpr.of(ops); - } + @JvmStatic + fun SDiv(leftOp: Expr, rightOp: Expr) = BvSDivExpr(leftOp, rightOp) - public static BvUDivExpr UDiv(final Expr leftOp, final Expr rightOp) { - return BvUDivExpr.of(leftOp, rightOp); - } + @JvmStatic + fun SMod(leftOp: Expr, rightOp: Expr) = BvSModExpr(leftOp, rightOp) - public static BvSDivExpr SDiv(final Expr leftOp, final Expr rightOp) { - return BvSDivExpr.of(leftOp, rightOp); - } + @JvmStatic + fun URem(leftOp: Expr, rightOp: Expr) = BvURemExpr(leftOp, rightOp) - public static BvSModExpr SMod(final Expr leftOp, final Expr rightOp) { - return BvSModExpr.of(leftOp, rightOp); - } + @JvmStatic + fun SRem(leftOp: Expr, rightOp: Expr) = BvSRemExpr(leftOp, rightOp) - public static BvURemExpr URem(final Expr leftOp, final Expr rightOp) { - return BvURemExpr.of(leftOp, rightOp); - } + @JvmStatic + fun Or(ops: Iterable>) = BvOrExpr.of(ops) - public static BvSRemExpr SRem(final Expr leftOp, final Expr rightOp) { - return BvSRemExpr.of(leftOp, rightOp); - } + @JvmStatic + fun And(ops: Iterable>) = BvAndExpr.of(ops) - public static BvOrExpr Or(final List> ops) { - return BvOrExpr.of(ops); - } + @JvmStatic + fun Xor(ops: Iterable>) = BvXorExpr.of(ops) - public static BvAndExpr And(final List> ops) { - return BvAndExpr.of(ops); - } + @JvmStatic + fun Not(op: Expr) = BvNotExpr(op) - public static BvXorExpr Xor(final List> ops) { - return BvXorExpr.of(ops); - } + @JvmStatic + fun ShiftLeft(leftOp: Expr, rightOp: Expr) = BvShiftLeftExpr(leftOp, rightOp) - public static BvNotExpr Not(final Expr op) { - return BvNotExpr.of(op); - } + @JvmStatic + fun ArithShiftRight(leftOp: Expr, rightOp: Expr) = BvArithShiftRightExpr(leftOp, rightOp) - public static BvShiftLeftExpr ShiftLeft(final Expr leftOp, final Expr rightOp) { - return BvShiftLeftExpr.of(leftOp, rightOp); - } - - public static BvArithShiftRightExpr ArithShiftRight( - final Expr leftOp, final Expr rightOp) { - return BvArithShiftRightExpr.of(leftOp, rightOp); - } + @JvmStatic + fun LogicShiftRight(leftOp: Expr, rightOp: Expr) = BvLogicShiftRightExpr(leftOp, rightOp) - public static BvLogicShiftRightExpr LogicShiftRight( - final Expr leftOp, final Expr rightOp) { - return BvLogicShiftRightExpr.of(leftOp, rightOp); - } - - public static BvRotateLeftExpr RotateLeft( - final Expr leftOp, final Expr rightOp) { - return BvRotateLeftExpr.of(leftOp, rightOp); - } - - public static BvRotateRightExpr RotateRight( - final Expr leftOp, final Expr rightOp) { - return BvRotateRightExpr.of(leftOp, rightOp); - } - - public static BvEqExpr Eq(final Expr leftOp, final Expr rightOp) { - return BvEqExpr.of(leftOp, rightOp); - } - - public static BvNeqExpr Neq(final Expr leftOp, final Expr rightOp) { - return BvNeqExpr.of(leftOp, rightOp); - } - - public static BvULtExpr ULt(final Expr leftOp, final Expr rightOp) { - return BvULtExpr.of(leftOp, rightOp); - } - - public static BvULeqExpr ULeq(final Expr leftOp, final Expr rightOp) { - return BvULeqExpr.of(leftOp, rightOp); - } - - public static BvUGtExpr UGt(final Expr leftOp, final Expr rightOp) { - return BvUGtExpr.of(leftOp, rightOp); - } - - public static BvUGeqExpr UGeq(final Expr leftOp, final Expr rightOp) { - return BvUGeqExpr.of(leftOp, rightOp); - } - - public static BvSLtExpr SLt(final Expr leftOp, final Expr rightOp) { - return BvSLtExpr.of(leftOp, rightOp); - } - - public static BvSLeqExpr SLeq(final Expr leftOp, final Expr rightOp) { - return BvSLeqExpr.of(leftOp, rightOp); - } - - public static BvSGtExpr SGt(final Expr leftOp, final Expr rightOp) { - return BvSGtExpr.of(leftOp, rightOp); - } - - public static BvSGeqExpr SGeq(final Expr leftOp, final Expr rightOp) { - return BvSGeqExpr.of(leftOp, rightOp); - } + @JvmStatic + fun RotateLeft(leftOp: Expr, rightOp: Expr) = BvRotateLeftExpr(leftOp, rightOp) + + @JvmStatic + fun RotateRight(leftOp: Expr, rightOp: Expr) = BvRotateRightExpr(leftOp, rightOp) + + @JvmStatic + fun Eq(leftOp: Expr, rightOp: Expr) = BvEqExpr(leftOp, rightOp) + + @JvmStatic + fun Neq(leftOp: Expr, rightOp: Expr) = BvNeqExpr(leftOp, rightOp) + + @JvmStatic + fun ULt(leftOp: Expr, rightOp: Expr) = BvULtExpr(leftOp, rightOp) + + @JvmStatic + fun ULeq(leftOp: Expr, rightOp: Expr) = BvULeqExpr(leftOp, rightOp) + + @JvmStatic + fun UGt(leftOp: Expr, rightOp: Expr) = BvUGtExpr(leftOp, rightOp) + + @JvmStatic + fun UGeq(leftOp: Expr, rightOp: Expr) = BvUGeqExpr(leftOp, rightOp) + + @JvmStatic + fun SLt(leftOp: Expr, rightOp: Expr) = BvSLtExpr(leftOp, rightOp) + + @JvmStatic + fun SLeq(leftOp: Expr, rightOp: Expr) = BvSLeqExpr(leftOp, rightOp) + + @JvmStatic + fun SGt(leftOp: Expr, rightOp: Expr) = BvSGtExpr(leftOp, rightOp) + + @JvmStatic + fun SGeq(leftOp: Expr, rightOp: Expr) = BvSGeqExpr(leftOp, rightOp) } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvExtractExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvExtractExpr.kt index 3786d3a35b..e94120fe5f 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvExtractExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvExtractExpr.kt @@ -13,143 +13,70 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.bvtype; -import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.base.Preconditions.checkNotNull; -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; -import static hu.bme.mit.theta.core.utils.TypeUtils.castBv; - -import com.google.common.collect.ImmutableList; -import hu.bme.mit.theta.common.Utils; -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.type.inttype.IntLitExpr; -import java.math.BigInteger; -import java.util.List; - -public final class BvExtractExpr implements Expr { - - private static final int HASH_SEED = 6586; - private static final String OPERATOR_LABEL = "extract"; - - private final Expr bitvec; - private final IntLitExpr from; - private final IntLitExpr until; - - private volatile int hashCode = 0; - - private BvExtractExpr( - final Expr bitvec, final IntLitExpr from, final IntLitExpr until) { - checkNotNull(bitvec); - checkNotNull(from); - checkNotNull(until); - checkArgument(from.getValue().compareTo(BigInteger.ZERO) >= 0); - checkArgument(until.getValue().compareTo(BigInteger.ZERO) >= 0); - checkArgument(until.getValue().compareTo(from.getValue()) > 0); - - this.bitvec = bitvec; - this.from = from; - this.until = until; - } - - public static BvExtractExpr of( - final Expr bitvec, final IntLitExpr from, final IntLitExpr until) { - return new BvExtractExpr(bitvec, from, until); - } - - public static BvExtractExpr create( - final Expr bitvec, final Expr from, final Expr until) { - final Expr newBitvec = castBv(bitvec); - final IntLitExpr newFrom = (IntLitExpr) cast(from, Int()); - final IntLitExpr newUntil = (IntLitExpr) cast(until, Int()); - return BvExtractExpr.of(newBitvec, newFrom, newUntil); - } - - public Expr getBitvec() { - return bitvec; - } - - public IntLitExpr getFrom() { - return from; - } - - public IntLitExpr getUntil() { - return until; - } - - @Override - public List> getOps() { - return ImmutableList.of(bitvec, from, until); - } - - @Override - public int getArity() { - return 3; - } - - @Override - public BvType getType() { - return bitvec.getType().withSize(until.getValue().subtract(from.getValue()).intValue()); - } - - @Override - public LitExpr eval(Valuation val) { - final BvLitExpr bvLitExpr = (BvLitExpr) bitvec.eval(val); - return bvLitExpr.extract(from, until); +package hu.bme.mit.theta.core.type.bvtype + +import hu.bme.mit.theta.common.Utils +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.inttype.IntExprs.Int +import hu.bme.mit.theta.core.type.inttype.IntLitExpr +import hu.bme.mit.theta.core.utils.TypeUtils +import hu.bme.mit.theta.core.utils.TypeUtils.castBv +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("BvExtract") +data class BvExtractExpr( + val bitvec: Expr, + val from: IntLitExpr, + val until: IntLitExpr +) : Expr { + + companion object { + + private const val OPERATOR_LABEL = "extract" + + @JvmStatic + fun of(bitvec: Expr, from: IntLitExpr, until: IntLitExpr) = BvExtractExpr(bitvec, from, until) + + @JvmStatic + fun create(bitvec: Expr<*>, from: Expr<*>, until: Expr<*>): BvExtractExpr { + val newBitvec = castBv(bitvec) + val newFrom = TypeUtils.cast(from, Int()) as IntLitExpr + val newUntil = TypeUtils.cast(until, Int()) as IntLitExpr + return of(newBitvec, newFrom, newUntil) + } } - @Override - public Expr withOps(List> ops) { - checkNotNull(ops); - checkArgument(ops.size() == 3); - final Expr newBitvec = castBv(ops.get(0)); - final IntLitExpr newFrom = (IntLitExpr) cast(ops.get(1), Int()); - final IntLitExpr newUntil = (IntLitExpr) cast(ops.get(2), Int()); + override val arity: Int = 3 + override val type: BvType = BvType.of(until.value.subtract(from.value).toInt()) + override val ops: List> = listOf(bitvec, from, until) - if (bitvec.equals(newBitvec) && from.equals(newFrom) && until.equals(newUntil)) { - return this; - } else { - return of(newBitvec, newFrom, newUntil); - } + override fun eval(`val`: Valuation): BvLitExpr { + val bitvecVal = bitvec.eval(`val`) as BvLitExpr + return bitvecVal.extract(from, until) } - @Override - public int hashCode() { - int result = hashCode; - if (result == 0) { - result = HASH_SEED; - result = 31 * result + bitvec.hashCode(); - result = 31 * result + from.hashCode(); - result = 31 * result + until.hashCode(); - hashCode = result; - } - return result; - } + override fun withOps(ops: List>): Expr { + require(ops.size == 3) + val newBitvec = castBv(ops[0]) + val newFrom = TypeUtils.cast(ops[1], Int()) as IntLitExpr + val newUntil = TypeUtils.cast(ops[2], Int()) as IntLitExpr - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final BvExtractExpr that = (BvExtractExpr) obj; - return this.getBitvec().equals(that.getBitvec()) - && this.getFrom().equals(that.getFrom()) - && this.getUntil().equals(that.getUntil()); + return if (bitvec == newBitvec && from == newFrom && until == newUntil) { + this } else { - return false; + of(newBitvec, newFrom, newUntil) } } - @Override - public String toString() { - return Utils.lispStringBuilder(OPERATOR_LABEL) - .body() - .add(getBitvec()) - .add(getFrom()) - .add(getUntil()) - .toString(); - } + override fun toString(): String = Utils.lispStringBuilder(OPERATOR_LABEL) + .body() + .add(bitvec) + .add(from) + .add(until) + .toString() } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvLitExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvLitExpr.kt index cdd88db510..38e11fec1e 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvLitExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvLitExpr.kt @@ -13,424 +13,390 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.bvtype; -import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.base.Preconditions.checkNotNull; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.type.bvtype.BvExprs.Bv; -import static hu.bme.mit.theta.core.type.bvtype.BvExprs.BvType; -import static hu.bme.mit.theta.core.utils.BvUtils.bigIntegerToNeutralBvLitExpr; -import static hu.bme.mit.theta.core.utils.BvUtils.bigIntegerToSignedBvLitExpr; -import static hu.bme.mit.theta.core.utils.BvUtils.bigIntegerToUnsignedBvLitExpr; -import static hu.bme.mit.theta.core.utils.BvUtils.fitBigIntegerIntoNeutralDomain; -import static hu.bme.mit.theta.core.utils.BvUtils.fitBigIntegerIntoSignedDomain; -import static hu.bme.mit.theta.core.utils.BvUtils.fitBigIntegerIntoUnsignedDomain; -import static hu.bme.mit.theta.core.utils.BvUtils.neutralBvLitExprToBigInteger; -import static hu.bme.mit.theta.core.utils.BvUtils.signedBvLitExprToBigInteger; -import static hu.bme.mit.theta.core.utils.BvUtils.unsignedBvLitExprToBigInteger; +package hu.bme.mit.theta.core.type.bvtype -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.type.NullaryExpr; -import hu.bme.mit.theta.core.type.booltype.BoolLitExpr; -import hu.bme.mit.theta.core.type.inttype.IntLitExpr; -import hu.bme.mit.theta.core.utils.BvUtils; -import java.math.BigInteger; -import java.util.Arrays; +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.type.NullaryExpr +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool +import hu.bme.mit.theta.core.type.booltype.BoolLitExpr +import hu.bme.mit.theta.core.type.inttype.IntLitExpr +import hu.bme.mit.theta.core.utils.BvUtils.* +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.Transient +import java.math.BigInteger +import kotlin.concurrent.Volatile -public final class BvLitExpr extends NullaryExpr - implements LitExpr, Comparable { +@Serializable +@SerialName("BvLit") +data class BvLitExpr( + val value: BooleanArray, + val signed: Boolean? = null +) : NullaryExpr(), LitExpr, Comparable { - private static final int HASH_SEED = 5624; - private volatile int hashCode = 0; - - private final boolean[] value; - private final Boolean signed; - - private BvLitExpr(final boolean[] value, final Boolean signed) { - this.signed = signed; - checkNotNull(value); - checkArgument(value.length > 0, "Bitvector must have positive size"); - - this.value = value; + init { + require(value.isNotEmpty()) { "Bitvector must have positive size." } } - public static BvLitExpr of(final boolean[] value, final Boolean signed) { - return new BvLitExpr(value, signed); - } + companion object { - public static BvLitExpr of(final boolean[] value) { - return of(value, null); - } + private const val HASH_SEED: Int = 5624 - public boolean[] getValue() { - return value; + @JvmStatic + fun of(value: BooleanArray, signed: Boolean? = null) = BvLitExpr(value, signed) } - @Override - public BvType getType() { - return BvType(value.length, signed); - } + @Volatile + @Transient + private var hashCode = 0 - @Override - public LitExpr eval(Valuation val) { - return this; - } + override val type: BvType get() = BvType(value.size, signed) + override fun eval(`val`: Valuation): BvLitExpr = this - public BvLitExpr concat(final BvLitExpr that) { - boolean[] concated = new boolean[this.getType().getSize() + that.getType().getSize()]; - for (int i = 0; i < this.getType().getSize(); i++) { - concated[i] = this.getValue()[i]; - } - for (int i = 0; i < that.getType().getSize(); i++) { - concated[this.getType().getSize() + i] = that.getValue()[i]; - } - return Bv(concated); + fun concat(that: BvLitExpr): BvLitExpr { + val concatenated = BooleanArray(this.type.size + that.type.size) + for (i in 0 until this.type.size) concatenated[i] = this.value[i] + for (i in 0 until that.type.size) concatenated[this.type.size + i] = that.value[i] + return of(concatenated) } - public BvLitExpr extract(final IntLitExpr from, final IntLitExpr until) { - final int fromValue = from.getValue().intValue(); - final int untilValue = until.getValue().intValue(); - checkArgument(fromValue >= 0); - checkArgument(untilValue >= 0); - checkArgument(untilValue > fromValue); - - boolean[] extracted = new boolean[untilValue - fromValue]; - for (int i = 0; i < extracted.length; i++) { - extracted[extracted.length - i - 1] = - this.getValue()[this.getValue().length - (fromValue + i) - 1]; + fun extract(from: IntLitExpr, until: IntLitExpr): BvLitExpr { + val fromValue = from.value.toInt() + val untilValue = until.value.toInt() + require(fromValue >= 0 && untilValue >= 0 && untilValue > fromValue) + val extracted = BooleanArray(untilValue - fromValue) + for (i in extracted.indices) { + extracted[extracted.size - i - 1] = this.value[this.value.size - (fromValue + i) - 1] } - return Bv(extracted); + return of(extracted) } - public BvLitExpr zext(final BvType extendType) { - checkArgument(extendType.getSize() >= this.getType().getSize()); - - boolean[] extended = new boolean[extendType.getSize()]; - for (int i = 0; i < this.getValue().length; i++) { - extended[extended.length - i - 1] = this.getValue()[this.getValue().length - i - 1]; + fun zext(extendType: BvType): BvLitExpr { + require(extendType.size >= this.type.size) + val extended = BooleanArray(extendType.size) + for (i in this.value.indices) { + extended[extended.size - i - 1] = this.value[this.value.size - i - 1] } - for (int i = 0; i < extendType.getSize() - this.getType().getSize(); i++) { - extended[i] = false; + for (i in 0 until extendType.size - this.type.size) { + extended[i] = false } - return Bv(extended); + return of(extended) } - public BvLitExpr sext(final BvType extendType) { - checkArgument(extendType.getSize() >= this.getType().getSize()); - - boolean[] extended = new boolean[extendType.getSize()]; - for (int i = 0; i < this.getValue().length; i++) { - extended[extended.length - i - 1] = this.getValue()[this.getValue().length - i - 1]; + fun sext(extendType: BvType): BvLitExpr { + require(extendType.size >= this.type.size) + val extended = BooleanArray(extendType.size) + for (i in this.value.indices) { + extended[extended.size - i - 1] = this.value[this.value.size - i - 1] } - for (int i = 0; i < extendType.getSize() - this.getType().getSize(); i++) { - extended[i] = this.getValue()[0]; + for (i in 0 until extendType.size - this.type.size) { + extended[i] = this.value[0] } - return Bv(extended); + return of(extended) } - public BvLitExpr add(final BvLitExpr that) { - checkArgument(this.getType().equals(that.getType())); - BigInteger sum = neutralBvLitExprToBigInteger(this).add(neutralBvLitExprToBigInteger(that)); - sum = fitBigIntegerIntoNeutralDomain(sum, getType().getSize()); - return bigIntegerToNeutralBvLitExpr(sum, getType().getSize()); + fun add(that: BvLitExpr): BvLitExpr { + require(this.type == that.type) + var sum = neutralBvLitExprToBigInteger(this).add(neutralBvLitExprToBigInteger(that)) + sum = fitBigIntegerIntoNeutralDomain(sum, type.size) + return bigIntegerToNeutralBvLitExpr(sum, type.size) } - public BvLitExpr sub(final BvLitExpr that) { - checkArgument(this.getType().equals(that.getType())); - BigInteger sub = - neutralBvLitExprToBigInteger(this).subtract(neutralBvLitExprToBigInteger(that)); - sub = fitBigIntegerIntoNeutralDomain(sub, getType().getSize()); - return bigIntegerToNeutralBvLitExpr(sub, getType().getSize()); + fun sub(that: BvLitExpr): BvLitExpr { + require(this.type == that.type) + var sub = neutralBvLitExprToBigInteger(this).subtract(neutralBvLitExprToBigInteger(that)) + sub = fitBigIntegerIntoNeutralDomain(sub, type.size) + return bigIntegerToNeutralBvLitExpr(sub, type.size) } - public BvLitExpr mul(final BvLitExpr that) { - checkArgument(this.getType().equals(that.getType())); - BigInteger prod = - neutralBvLitExprToBigInteger(this).multiply(neutralBvLitExprToBigInteger(that)); - prod = fitBigIntegerIntoNeutralDomain(prod, getType().getSize()); - return bigIntegerToNeutralBvLitExpr(prod, getType().getSize()); + fun mul(that: BvLitExpr): BvLitExpr { + require(this.type == that.type) + var prod = neutralBvLitExprToBigInteger(this).multiply(neutralBvLitExprToBigInteger(that)) + prod = fitBigIntegerIntoNeutralDomain(prod, type.size) + return bigIntegerToNeutralBvLitExpr(prod, type.size) } - public BvLitExpr pos() { - BigInteger pos = signedBvLitExprToBigInteger(this); - pos = fitBigIntegerIntoSignedDomain(pos, getType().getSize()); - return bigIntegerToSignedBvLitExpr(pos, getType().getSize()); + fun pos(): BvLitExpr { + var pos = signedBvLitExprToBigInteger(this) + pos = fitBigIntegerIntoSignedDomain(pos, type.size) + return bigIntegerToSignedBvLitExpr(pos, type.size) } - public BvLitExpr neg() { - BigInteger neg = signedBvLitExprToBigInteger(this).negate(); - neg = fitBigIntegerIntoSignedDomain(neg, getType().getSize()); - return bigIntegerToSignedBvLitExpr(neg, getType().getSize()); + fun neg(): BvLitExpr { + var neg = signedBvLitExprToBigInteger(this).negate() + neg = fitBigIntegerIntoSignedDomain(neg, type.size) + return bigIntegerToSignedBvLitExpr(neg, type.size) } - public BvLitExpr udiv(final BvLitExpr that) { - checkArgument(this.getType().equals(that.getType())); - BigInteger div = - unsignedBvLitExprToBigInteger(this).divide(unsignedBvLitExprToBigInteger(that)); - div = fitBigIntegerIntoUnsignedDomain(div, getType().getSize()); - return bigIntegerToUnsignedBvLitExpr(div, getType().getSize()); + fun udiv(that: BvLitExpr): BvLitExpr { + require(this.type == that.type) + var div = unsignedBvLitExprToBigInteger(this).divide(unsignedBvLitExprToBigInteger(that)) + div = fitBigIntegerIntoUnsignedDomain(div, type.size) + return bigIntegerToUnsignedBvLitExpr(div, type.size) } - public BvLitExpr sdiv(final BvLitExpr that) { - checkArgument(this.getType().equals(that.getType())); - BigInteger div = - signedBvLitExprToBigInteger(this).divide(signedBvLitExprToBigInteger(that)); - div = fitBigIntegerIntoSignedDomain(div, getType().getSize()); - return bigIntegerToSignedBvLitExpr(div, getType().getSize()); + fun sdiv(that: BvLitExpr): BvLitExpr { + require(this.type == that.type) + var div = signedBvLitExprToBigInteger(this).divide(signedBvLitExprToBigInteger(that)) + div = fitBigIntegerIntoSignedDomain(div, type.size) + return bigIntegerToSignedBvLitExpr(div, type.size) } - public BvLitExpr and(final BvLitExpr that) { - checkArgument(this.getType().equals(that.getType())); - BigInteger and = neutralBvLitExprToBigInteger(this).and(neutralBvLitExprToBigInteger(that)); - return bigIntegerToNeutralBvLitExpr(and, getType().getSize()); + fun and(that: BvLitExpr): BvLitExpr { + require(this.type == that.type) + val and = neutralBvLitExprToBigInteger(this).and(neutralBvLitExprToBigInteger(that)) + return bigIntegerToNeutralBvLitExpr(and, type.size) } - public BvLitExpr or(final BvLitExpr that) { - checkArgument(this.getType().equals(that.getType())); - BigInteger or = neutralBvLitExprToBigInteger(this).or(neutralBvLitExprToBigInteger(that)); - return bigIntegerToNeutralBvLitExpr(or, getType().getSize()); + fun or(that: BvLitExpr): BvLitExpr { + require(this.type == that.type) + val or = neutralBvLitExprToBigInteger(this).or(neutralBvLitExprToBigInteger(that)) + return bigIntegerToNeutralBvLitExpr(or, type.size) } - public BvLitExpr xor(final BvLitExpr that) { - checkArgument(this.getType().equals(that.getType())); - BigInteger xor = neutralBvLitExprToBigInteger(this).xor(neutralBvLitExprToBigInteger(that)); - return bigIntegerToNeutralBvLitExpr(xor, getType().getSize()); + fun xor(that: BvLitExpr): BvLitExpr { + require(this.type == that.type) + val xor = neutralBvLitExprToBigInteger(this).xor(neutralBvLitExprToBigInteger(that)) + return bigIntegerToNeutralBvLitExpr(xor, type.size) } - public BvLitExpr not() { - BigInteger not = neutralBvLitExprToBigInteger(this).not(); - return bigIntegerToNeutralBvLitExpr(not, getType().getSize()); + fun not(): BvLitExpr { + val not = neutralBvLitExprToBigInteger(this).not() + return bigIntegerToNeutralBvLitExpr(not, type.size) } - public BvLitExpr shiftLeft(final BvLitExpr that) { - checkArgument(this.getType().equals(that.getType())); - - boolean[] shifted = Arrays.copyOf(this.getValue(), this.getValue().length); - for (BigInteger i = BigInteger.ZERO; - i.compareTo(neutralBvLitExprToBigInteger(that)) < 0; - i = i.add(BigInteger.ONE)) { - for (int j = 0; j < shifted.length - 1; j++) { - shifted[j] = shifted[j + 1]; + fun shiftLeft(that: BvLitExpr): BvLitExpr { + require(this.type == that.type) + val shifted = value.copyOf(value.size) + val shift = neutralBvLitExprToBigInteger(that) + var i = BigInteger.ZERO + while (i < shift) { + for (j in 0 until shifted.size - 1) { + shifted[j] = shifted[j + 1] } - shifted[shifted.length - 1] = false; + shifted[shifted.size - 1] = false + i = i.add(BigInteger.ONE) } - return Bv(shifted); - } - - public BvLitExpr arithShiftRight(final BvLitExpr that) { - checkArgument(this.getType().equals(that.getType())); - - boolean[] shifted = Arrays.copyOf(this.getValue(), this.getValue().length); - boolean insert = shifted[0]; - for (BigInteger i = BigInteger.ZERO; - i.compareTo(neutralBvLitExprToBigInteger(that)) < 0; - i = i.add(BigInteger.ONE)) { - for (int j = shifted.length - 1; j > 0; j--) { - shifted[j] = shifted[j - 1]; + return of(shifted) + } + + fun arithShiftRight(that: BvLitExpr): BvLitExpr { + require(this.type == that.type) + val shifted = value.copyOf(value.size) + val insert = shifted[0] + val shift = neutralBvLitExprToBigInteger(that) + var i = BigInteger.ZERO + while (i < shift) { + for (j in shifted.size - 1 downTo 1) { + shifted[j] = shifted[j - 1] } - shifted[0] = insert; + shifted[0] = insert + i = i.add(BigInteger.ONE) } - return Bv(shifted); + return of(shifted) } - public BvLitExpr logicShiftRight(final BvLitExpr that) { - checkArgument(this.getType().equals(that.getType())); - - boolean[] shifted = Arrays.copyOf(this.getValue(), this.getValue().length); - boolean insert = false; - for (BigInteger i = BigInteger.ZERO; - i.compareTo(neutralBvLitExprToBigInteger(that)) < 0; - i = i.add(BigInteger.ONE)) { - for (int j = shifted.length - 1; j > 0; j--) { - shifted[j] = shifted[j - 1]; + fun logicShiftRight(that: BvLitExpr): BvLitExpr { + require(this.type == that.type) + val shifted = value.copyOf(value.size) + val shift = neutralBvLitExprToBigInteger(that) + var i = BigInteger.ZERO + while (i < shift) { + for (j in shifted.size - 1 downTo 1) { + shifted[j] = shifted[j - 1] } - shifted[0] = insert; + shifted[0] = false + i = i.add(BigInteger.ONE) } - return Bv(shifted); - } - - public BvLitExpr rotateLeft(final BvLitExpr that) { - checkArgument(this.getType().equals(that.getType())); - - boolean[] shifted = Arrays.copyOf(this.getValue(), this.getValue().length); - for (BigInteger i = BigInteger.ZERO; - i.compareTo(neutralBvLitExprToBigInteger(that)) < 0; - i = i.add(BigInteger.ONE)) { - boolean rotated = shifted[0]; - for (int j = 0; j < shifted.length - 1; j++) { - shifted[j] = shifted[j + 1]; + return of(shifted) + } + + fun rotateLeft(that: BvLitExpr): BvLitExpr { + require(this.type == that.type) + val shifted = value.copyOf(value.size) + val shift = neutralBvLitExprToBigInteger(that) + var i = BigInteger.ZERO + while (i < shift) { + val rotated = shifted[0] + for (j in 0 until shifted.size - 1) { + shifted[j] = shifted[j + 1] } - shifted[shifted.length - 1] = rotated; + shifted[shifted.size - 1] = rotated + i = i.add(BigInteger.ONE) } - return Bv(shifted); - } - - public BvLitExpr rotateRight(final BvLitExpr that) { - checkArgument(this.getType().equals(that.getType())); - - boolean[] shifted = Arrays.copyOf(this.getValue(), this.getValue().length); - for (BigInteger i = BigInteger.ZERO; - i.compareTo(neutralBvLitExprToBigInteger(that)) < 0; - i = i.add(BigInteger.ONE)) { - boolean rotated = shifted[shifted.length - 1]; - for (int j = shifted.length - 1; j > 0; j--) { - shifted[j] = shifted[j - 1]; + return of(shifted) + } + + fun rotateRight(that: BvLitExpr): BvLitExpr { + require(this.type == that.type) + val shifted = value.copyOf(value.size) + val shift = neutralBvLitExprToBigInteger(that) + var i = BigInteger.ZERO + while (i < shift) { + val rotated = shifted[shifted.size - 1] + for (j in shifted.size - 1 downTo 1) { + shifted[j] = shifted[j - 1] } - shifted[0] = rotated; + shifted[0] = rotated + i = i.add(BigInteger.ONE) } - return Bv(shifted); + return of(shifted) } - public BvLitExpr smod(final BvLitExpr that) { - checkArgument(this.getType().equals(that.getType())); + fun smod(that: BvLitExpr): BvLitExpr { + require(this.type == that.type) // Always positive semantics: // 5 mod 3 = 2 // 5 mod -3 = 2 // -5 mod 3 = 1 // -5 mod -3 = 1 - BigInteger result = - signedBvLitExprToBigInteger(this).mod(signedBvLitExprToBigInteger(that)); - if (result.compareTo(BigInteger.ZERO) < 0) { - result = result.add(signedBvLitExprToBigInteger(that).abs()); + var result = signedBvLitExprToBigInteger(this).mod(signedBvLitExprToBigInteger(that)) + if (result < BigInteger.ZERO) { + result = result.add(signedBvLitExprToBigInteger(that).abs()) } - assert result.compareTo(BigInteger.ZERO) >= 0; - return bigIntegerToSignedBvLitExpr(result, getType().getSize()); + require(result >= BigInteger.ZERO) + return bigIntegerToSignedBvLitExpr(result, type.size) } - public BvLitExpr urem(final BvLitExpr that) { + fun urem(that: BvLitExpr): BvLitExpr { // Semantics: // 5 rem 3 = 2 - BigInteger thisInt = signedBvLitExprToBigInteger(this); - BigInteger thatInt = signedBvLitExprToBigInteger(that); - return bigIntegerToSignedBvLitExpr(thisInt.mod(thatInt), getType().getSize()); + val thisInt = signedBvLitExprToBigInteger(this) + val thatInt = signedBvLitExprToBigInteger(that) + return bigIntegerToSignedBvLitExpr(thisInt.mod(thatInt), type.size) } - public BvLitExpr srem(final BvLitExpr that) { + fun srem(that: BvLitExpr): BvLitExpr { // Semantics: // 5 rem 3 = 2 // 5 rem -3 = 2 // -5 rem 3 = -1 // -5 rem -3 = -1 - BigInteger thisInt = BvUtils.signedBvLitExprToBigInteger(this); - BigInteger thatInt = BvUtils.signedBvLitExprToBigInteger(that); - BigInteger thisAbs = thisInt.abs(); - BigInteger thatAbs = thatInt.abs(); - if (thisInt.compareTo(BigInteger.ZERO) < 0 && thatInt.compareTo(BigInteger.ZERO) < 0) { - return bigIntegerToSignedBvLitExpr(thisAbs.mod(thatAbs).negate(), getType().getSize()); - } else if (thisInt.compareTo(BigInteger.ZERO) >= 0 - && thatInt.compareTo(BigInteger.ZERO) < 0) { - return bigIntegerToSignedBvLitExpr(thisAbs.mod(thatAbs), getType().getSize()); - } else if (thisInt.compareTo(BigInteger.ZERO) < 0 - && thatInt.compareTo(BigInteger.ZERO) >= 0) { - return bigIntegerToSignedBvLitExpr(thisAbs.mod(thatAbs).negate(), getType().getSize()); - } else { - return bigIntegerToSignedBvLitExpr(thisInt.mod(thatInt), getType().getSize()); + val thisInt = signedBvLitExprToBigInteger(this) + val thatInt = signedBvLitExprToBigInteger(that) + val thisAbs = thisInt.abs() + val thatAbs = thatInt.abs() + return when { + thisInt < BigInteger.ZERO && thatInt < BigInteger.ZERO -> { + bigIntegerToSignedBvLitExpr(thisAbs.mod(thatAbs).negate(), type.size) + } + + thisInt >= BigInteger.ZERO && thatInt < BigInteger.ZERO -> { + bigIntegerToSignedBvLitExpr(thisAbs.mod(thatAbs), type.size) + } + + thisInt < BigInteger.ZERO && thatInt >= BigInteger.ZERO -> { + bigIntegerToSignedBvLitExpr(thisAbs.mod(thatAbs).negate(), type.size) + } + + else -> { + bigIntegerToSignedBvLitExpr(thisInt.mod(thatInt), type.size) + } } } - public BoolLitExpr eq(final BvLitExpr that) { - checkArgument(this.getType().equals(that.getType())); - return Bool(Arrays.equals(this.getValue(), that.getValue())); + fun eq(that: BvLitExpr): BoolLitExpr { + require(this.type == that.type) + return Bool(this.value.contentEquals(that.value)) } - public BoolLitExpr neq(final BvLitExpr that) { - checkArgument(this.getType().equals(that.getType())); - return Bool(!Arrays.equals(this.getValue(), that.getValue())); + fun neq(that: BvLitExpr): BoolLitExpr { + require(this.type == that.type) + return Bool(!this.value.contentEquals(that.value)) } - public BoolLitExpr ult(final BvLitExpr that) { - checkArgument(this.getType().equals(that.getType())); + fun ult(that: BvLitExpr): BoolLitExpr { + require(this.type == that.type) return Bool( - unsignedBvLitExprToBigInteger(this).compareTo(unsignedBvLitExprToBigInteger(that)) - < 0); + unsignedBvLitExprToBigInteger(this) < unsignedBvLitExprToBigInteger(that) + ) } - public BoolLitExpr ule(final BvLitExpr that) { - checkArgument(this.getType().equals(that.getType())); + fun ule(that: BvLitExpr): BoolLitExpr { + require(this.type == that.type) return Bool( - unsignedBvLitExprToBigInteger(this).compareTo(unsignedBvLitExprToBigInteger(that)) - <= 0); + unsignedBvLitExprToBigInteger(this) <= unsignedBvLitExprToBigInteger(that) + ) } - public BoolLitExpr ugt(final BvLitExpr that) { - checkArgument(this.getType().equals(that.getType())); + fun ugt(that: BvLitExpr): BoolLitExpr { + require(this.type == that.type) return Bool( - unsignedBvLitExprToBigInteger(this).compareTo(unsignedBvLitExprToBigInteger(that)) - > 0); + unsignedBvLitExprToBigInteger(this) > unsignedBvLitExprToBigInteger(that) + ) } - public BoolLitExpr uge(final BvLitExpr that) { - checkArgument(this.getType().equals(that.getType())); + fun uge(that: BvLitExpr): BoolLitExpr { + require(this.type == that.type) return Bool( - unsignedBvLitExprToBigInteger(this).compareTo(unsignedBvLitExprToBigInteger(that)) - >= 0); + unsignedBvLitExprToBigInteger(this) >= unsignedBvLitExprToBigInteger(that) + ) } - public BoolLitExpr slt(final BvLitExpr that) { - checkArgument(this.getType().equals(that.getType())); + fun slt(that: BvLitExpr): BoolLitExpr { + require(this.type == that.type) return Bool( - signedBvLitExprToBigInteger(this).compareTo(signedBvLitExprToBigInteger(that)) < 0); + signedBvLitExprToBigInteger(this) < signedBvLitExprToBigInteger(that) + ) } - public BoolLitExpr sle(final BvLitExpr that) { - checkArgument(this.getType().equals(that.getType())); + fun sle(that: BvLitExpr): BoolLitExpr { + require(this.type == that.type) return Bool( - signedBvLitExprToBigInteger(this).compareTo(signedBvLitExprToBigInteger(that)) - <= 0); + signedBvLitExprToBigInteger(this) <= signedBvLitExprToBigInteger(that) + ) } - public BoolLitExpr sgt(final BvLitExpr that) { - checkArgument(this.getType().equals(that.getType())); + fun sgt(that: BvLitExpr): BoolLitExpr { + require(this.type == that.type) return Bool( - signedBvLitExprToBigInteger(this).compareTo(signedBvLitExprToBigInteger(that)) > 0); + signedBvLitExprToBigInteger(this) > signedBvLitExprToBigInteger(that) + ) } - public BoolLitExpr sge(final BvLitExpr that) { - checkArgument(this.getType().equals(that.getType())); + fun sge(that: BvLitExpr): BoolLitExpr { + require(this.type == that.type) return Bool( - signedBvLitExprToBigInteger(this).compareTo(signedBvLitExprToBigInteger(that)) - >= 0); + signedBvLitExprToBigInteger(this) >= signedBvLitExprToBigInteger(that) + ) } - @Override - public int hashCode() { - int result = hashCode; + override fun compareTo(other: BvLitExpr): Int { + // Use unsigned comparison for ordering + return unsignedBvLitExprToBigInteger(this).compareTo(unsignedBvLitExprToBigInteger(other)) + } + + + override fun hashCode(): Int { + var result = hashCode if (result == 0) { - result = HASH_SEED; - result = 31 * result + Arrays.hashCode(value); - hashCode = result; + result = HASH_SEED + result = 31 * result + value.contentHashCode() + hashCode = result } - return result; + return result } - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final BvLitExpr that = (BvLitExpr) obj; - return Arrays.equals(this.value, that.value); + override fun equals(other: Any?): Boolean { + if (this === other) { + return true + } else if (other != null && this.javaClass == other.javaClass) { + val that = other as BvLitExpr + return value.contentEquals(that.value) } else { - return false; + return false } } - @Override - public String toString() { - final StringBuilder sb = new StringBuilder(); + override fun toString(): String { + val sb = StringBuilder() // sb.append(getType().getSize()); - sb.append("#b"); - for (boolean bit : value) { - sb.append(bit ? "1" : "0"); + sb.append("#b") + for (bit in value) { + sb.append(if (bit) "1" else "0") } - return sb.toString(); - } - - @Override - public int compareTo(final BvLitExpr that) { - checkArgument(this.getType().equals(that.getType())); - return neutralBvLitExprToBigInteger(this).compareTo(neutralBvLitExprToBigInteger(that)); + return sb.toString() } } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvLogicShiftRightExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvLogicShiftRightExpr.kt index d4fd45089b..9625de5489 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvLogicShiftRightExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvLogicShiftRightExpr.kt @@ -13,86 +13,45 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.bvtype; -import static hu.bme.mit.theta.core.utils.TypeUtils.castBv; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; +package hu.bme.mit.theta.core.type.bvtype -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.BinaryExpr; -import hu.bme.mit.theta.core.type.Expr; +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.BinaryExpr +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.utils.TypeUtils +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -public final class BvLogicShiftRightExpr extends BinaryExpr { +@Serializable +@SerialName("BvLogicShiftRight") +data class BvLogicShiftRightExpr( + override val leftOp: Expr, + override val rightOp: Expr +) : BinaryExpr() { - private static final int HASH_SEED = 962; - private static final String OPERATOR_LABEL = "bvlshr"; + companion object { + private const val OPERATOR_LABEL = "bvlshr" - private BvLogicShiftRightExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - checkAllTypesEqual(leftOp, rightOp); - } - - public static BvLogicShiftRightExpr of(final Expr leftOp, final Expr rightOp) { - return new BvLogicShiftRightExpr(leftOp, rightOp); - } - - public static BvLogicShiftRightExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = castBv(leftOp); - final Expr newRightOp = castBv(rightOp); - return BvLogicShiftRightExpr.of(newLeftOp, newRightOp); - } - - @Override - public BvType getType() { - return getOps().get(0).getType(); - } + @JvmStatic + fun of(leftOp: Expr, rightOp: Expr) = BvLogicShiftRightExpr(leftOp, rightOp) - @Override - public BvLitExpr eval(final Valuation val) { - final BvLitExpr leftOpVal = (BvLitExpr) getLeftOp().eval(val); - final BvLitExpr rightOpVal = (BvLitExpr) getRightOp().eval(val); - return leftOpVal.logicShiftRight(rightOpVal); + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = BvLogicShiftRightExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) } - @Override - public BvLogicShiftRightExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return BvLogicShiftRightExpr.of(leftOp, rightOp); - } - } + override val type: BvType get() = leftOp.type - @Override - public BvLogicShiftRightExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); + override fun eval(`val`: Valuation): BvLitExpr { + val leftOpVal = leftOp.eval(`val`) as BvLitExpr + val rightOpVal = rightOp.eval(`val`) as BvLitExpr + return leftOpVal.logicShiftRight(rightOpVal) } - @Override - public BvLogicShiftRightExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } + override fun of(leftOp: Expr, rightOp: Expr): BvLogicShiftRightExpr = Companion.of(leftOp, rightOp) - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final BvLogicShiftRightExpr that = (BvLogicShiftRightExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } + override val operatorLabel: String get() = OPERATOR_LABEL - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } + override fun toString(): String = super.toString() } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvMulExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvMulExpr.kt index 92a12a7599..b4839ceba3 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvMulExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvMulExpr.kt @@ -13,80 +13,41 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.bvtype; -import static com.google.common.base.Preconditions.checkNotNull; -import static com.google.common.collect.ImmutableList.toImmutableList; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; +package hu.bme.mit.theta.core.type.bvtype -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.MulExpr; -import hu.bme.mit.theta.core.utils.TypeUtils; -import java.util.List; +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.MulExpr +import hu.bme.mit.theta.core.utils.TypeUtils +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -public final class BvMulExpr extends MulExpr { +@Serializable +@SerialName("BvMul") +data class BvMulExpr( + override val ops: List> +) : MulExpr() { - private static final int HASH_SEED = 9825; - private static final String OPERATOR_LABEL = "bvmul"; + companion object { + private const val OPERATOR_LABEL = "bvmul" - private BvMulExpr(final Iterable> ops) { - super(ops); - checkAllTypesEqual(ops); - } + @JvmStatic + fun of(ops: Iterable>) = BvMulExpr(ops.toList()) - public static BvMulExpr of(final Iterable> ops) { - return new BvMulExpr(ops); + @JvmStatic + fun create(ops: List>) = BvMulExpr(ops.map { TypeUtils.castBv(it) }) } - public static BvMulExpr create(final List> ops) { - checkNotNull(ops); - return BvMulExpr.of(ops.stream().map(TypeUtils::castBv).collect(toImmutableList())); - } + override val type: BvType get() = ops[0].type - @Override - public BvType getType() { - return getOps().get(0).getType(); + override fun eval(`val`: Valuation): BvLitExpr = ops.drop(1).fold(ops[0].eval(`val`) as BvLitExpr) { acc, op -> + acc.mul(op.eval(`val`) as BvLitExpr) } - @Override - public BvLitExpr eval(final Valuation val) { - return getOps().stream() - .skip(1) - .reduce( - (BvLitExpr) getOps().get(0).eval(val), - (op1, op2) -> (op1.mul((BvLitExpr) op2.eval(val))), - BvLitExpr::mul); - } + override fun of(ops: List>): BvMulExpr = Companion.of(ops) - @Override - public BvMulExpr with(final Iterable> ops) { - if (ops == getOps()) { - return this; - } else { - return BvMulExpr.of(ops); - } - } + override val operatorLabel: String get() = OPERATOR_LABEL - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final BvMulExpr that = (BvMulExpr) obj; - return this.getOps().equals(that.getOps()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } + override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvNegExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvNegExpr.kt index cc1b6de612..acb98254b4 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvNegExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvNegExpr.kt @@ -13,71 +13,42 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.bvtype; -import static hu.bme.mit.theta.core.utils.TypeUtils.castBv; +package hu.bme.mit.theta.core.type.bvtype -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.NegExpr; +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.NegExpr +import hu.bme.mit.theta.core.utils.TypeUtils +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -public final class BvNegExpr extends NegExpr { +@Serializable +@SerialName("BvNeg") +data class BvNegExpr( + override val op: Expr +) : NegExpr() { - private static final int HASH_SEED = 8325; - private static final String OPERATOR_LABEL = "bvneg"; + companion object { + private const val OPERATOR_LABEL = "bvneg" - private BvNegExpr(final Expr op) { - super(op); - } + @JvmStatic + fun of(op: Expr) = BvNegExpr(op) - public static BvNegExpr of(final Expr op) { - return new BvNegExpr(op); + @JvmStatic + fun create(op: Expr<*>) = BvNegExpr(TypeUtils.castBv(op)) } - public static BvNegExpr create(final Expr op) { - final Expr newOp = castBv(op); - return BvNegExpr.of(newOp); - } + override val type: BvType get() = op.type - @Override - public BvType getType() { - return getOp().getType(); + override fun eval(`val`: Valuation): BvLitExpr { + val opVal = op.eval(`val`) as BvLitExpr + return opVal.neg() } - @Override - public BvLitExpr eval(final Valuation val) { - final BvLitExpr opVal = (BvLitExpr) getOp().eval(val); - return opVal.neg(); - } + override fun of(op: Expr): BvNegExpr = Companion.of(op) - @Override - public BvNegExpr with(final Expr op) { - if (op == getOp()) { - return this; - } else { - return BvNegExpr.of(op); - } - } + override val operatorLabel: String get() = OPERATOR_LABEL - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final BvNegExpr that = (BvNegExpr) obj; - return this.getOp().equals(that.getOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } + override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvNeqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvNeqExpr.kt index c9db1875c1..1710e13fc1 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvNeqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvNeqExpr.kt @@ -13,90 +13,47 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.bvtype; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.utils.TypeUtils.castBv; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; +package hu.bme.mit.theta.core.type.bvtype -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.NeqExpr; -import hu.bme.mit.theta.core.type.booltype.BoolLitExpr; -import hu.bme.mit.theta.core.type.booltype.BoolType; +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.NeqExpr +import hu.bme.mit.theta.core.type.booltype.BoolLitExpr +import hu.bme.mit.theta.core.type.booltype.BoolType +import hu.bme.mit.theta.core.type.booltype.BoolExprs +import hu.bme.mit.theta.core.utils.TypeUtils +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -public final class BvNeqExpr extends NeqExpr { +@Serializable +@SerialName("BvNeq") +data class BvNeqExpr( + override val leftOp: Expr, + override val rightOp: Expr +) : NeqExpr() { - private static final int HASH_SEED = 2488; - private static final String OPERATOR_LABEL = "/="; + companion object { + private const val OPERATOR_LABEL = "/=" - private BvNeqExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - checkAllTypesEqual(leftOp, rightOp); - } - - public static BvNeqExpr of(final Expr leftOp, final Expr rightOp) { - return new BvNeqExpr(leftOp, rightOp); - } - - public static BvNeqExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = castBv(leftOp); - final Expr newRightOp = castBv(rightOp); - return BvNeqExpr.of(newLeftOp, newRightOp); - } - - @Override - public BoolType getType() { - return Bool(); - } + @JvmStatic + fun of(leftOp: Expr, rightOp: Expr) = BvNeqExpr(leftOp, rightOp) - @Override - public BoolLitExpr eval(final Valuation val) { - final BvLitExpr leftOpVal = (BvLitExpr) getLeftOp().eval(val); - final BvLitExpr rightOpVal = (BvLitExpr) getRightOp().eval(val); - - return leftOpVal.neq(rightOpVal); + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = BvNeqExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) } - @Override - public BvNeqExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return BvNeqExpr.of(leftOp, rightOp); - } - } + override val type: BoolType get() = BoolExprs.Bool() - @Override - public BvNeqExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); + override fun eval(`val`: Valuation): BoolLitExpr { + val leftOpVal = leftOp.eval(`val`) as BvLitExpr + val rightOpVal = rightOp.eval(`val`) as BvLitExpr + return leftOpVal.neq(rightOpVal) } - @Override - public BvNeqExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } + override fun of(leftOp: Expr, rightOp: Expr): BvNeqExpr = Companion.of(leftOp, rightOp) - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final BvNeqExpr that = (BvNeqExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } + override val operatorLabel: String get() = OPERATOR_LABEL - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } + override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvNotExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvNotExpr.kt index f4132cf51d..008335f3a2 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvNotExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvNotExpr.kt @@ -13,71 +13,42 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.bvtype; -import static hu.bme.mit.theta.core.utils.TypeUtils.castBv; +package hu.bme.mit.theta.core.type.bvtype -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.UnaryExpr; +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.UnaryExpr +import hu.bme.mit.theta.core.utils.TypeUtils +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -public final class BvNotExpr extends UnaryExpr { +@Serializable +@SerialName("BvNot") +data class BvNotExpr( + override val op: Expr +) : UnaryExpr() { - private static final int HASH_SEED = 1527; - private static final String OPERATOR_LABEL = "bvnot"; + companion object { + private const val OPERATOR_LABEL = "bvnot" - private BvNotExpr(final Expr op) { - super(op); - } + @JvmStatic + fun of(op: Expr) = BvNotExpr(op) - public static BvNotExpr of(final Expr op) { - return new BvNotExpr(op); + @JvmStatic + fun create(op: Expr<*>) = BvNotExpr(TypeUtils.castBv(op)) } - public static BvNotExpr create(final Expr op) { - final Expr newOp = castBv(op); - return BvNotExpr.of(newOp); - } + override val type: BvType get() = op.type - @Override - public BvType getType() { - return getOp().getType(); + override fun eval(`val`: Valuation): BvLitExpr { + val opVal = op.eval(`val`) as BvLitExpr + return opVal.not() } - @Override - public BvLitExpr eval(final Valuation val) { - final BvLitExpr opVal = (BvLitExpr) getOp().eval(val); - return opVal.not(); - } + override fun of(op: Expr): BvNotExpr = Companion.of(op) - @Override - public BvNotExpr with(final Expr op) { - if (op == getOp()) { - return this; - } else { - return BvNotExpr.of(op); - } - } + override val operatorLabel: String get() = OPERATOR_LABEL - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final BvNotExpr that = (BvNotExpr) obj; - return this.getOp().equals(that.getOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } + override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvOrExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvOrExpr.kt index 32fd5b8507..9105ecf9a4 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvOrExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvOrExpr.kt @@ -13,80 +13,41 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.bvtype; -import static com.google.common.base.Preconditions.checkNotNull; -import static com.google.common.collect.ImmutableList.toImmutableList; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; +package hu.bme.mit.theta.core.type.bvtype -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.MultiaryExpr; -import hu.bme.mit.theta.core.utils.TypeUtils; -import java.util.List; +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.MultiaryExpr +import hu.bme.mit.theta.core.utils.TypeUtils +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -public final class BvOrExpr extends MultiaryExpr { +@Serializable +@SerialName("BvOr") +data class BvOrExpr( + override val ops: List> +) : MultiaryExpr() { - private static final int HASH_SEED = 2745; - private static final String OPERATOR_LABEL = "bvor"; + companion object { + private const val OPERATOR_LABEL = "bvor" - private BvOrExpr(final Iterable> ops) { - super(ops); - checkAllTypesEqual(ops); - } + @JvmStatic + fun of(ops: Iterable>) = BvOrExpr(ops.toList()) - public static BvOrExpr of(final Iterable> ops) { - return new BvOrExpr(ops); + @JvmStatic + fun create(ops: List>) = BvOrExpr(ops.map { TypeUtils.castBv(it) }) } - public static BvOrExpr create(final List> ops) { - checkNotNull(ops); - return BvOrExpr.of(ops.stream().map(TypeUtils::castBv).collect(toImmutableList())); - } + override val type: BvType get() = ops[0].type - @Override - public BvType getType() { - return getOps().get(0).getType(); + override fun eval(`val`: Valuation): BvLitExpr = ops.drop(1).fold(ops[0].eval(`val`) as BvLitExpr) { acc, op -> + acc.or(op.eval(`val`) as BvLitExpr) } - @Override - public BvLitExpr eval(final Valuation val) { - return getOps().stream() - .skip(1) - .reduce( - (BvLitExpr) getOps().get(0).eval(val), - (op1, op2) -> (op1.or((BvLitExpr) op2.eval(val))), - BvLitExpr::or); - } + override fun of(ops: List>): BvOrExpr = Companion.of(ops) - @Override - public BvOrExpr with(final Iterable> ops) { - if (ops == getOps()) { - return this; - } else { - return BvOrExpr.of(ops); - } - } + override val operatorLabel: String get() = OPERATOR_LABEL - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final BvOrExpr that = (BvOrExpr) obj; - return this.getOps().equals(that.getOps()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } + override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvPosExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvPosExpr.kt index 8ab76b35bf..01fe80400f 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvPosExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvPosExpr.kt @@ -13,71 +13,42 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.bvtype; -import static hu.bme.mit.theta.core.utils.TypeUtils.castBv; +package hu.bme.mit.theta.core.type.bvtype -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.PosExpr; +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.PosExpr +import hu.bme.mit.theta.core.utils.TypeUtils +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -public final class BvPosExpr extends PosExpr { +@Serializable +@SerialName("BvPos") +data class BvPosExpr( + override val op: Expr +) : PosExpr() { - private static final int HASH_SEED = 8962; - private static final String OPERATOR_LABEL = "bvpos"; + companion object { + private const val OPERATOR_LABEL = "bvpos" - private BvPosExpr(final Expr op) { - super(op); - } + @JvmStatic + fun of(op: Expr) = BvPosExpr(op) - public static BvPosExpr of(final Expr op) { - return new BvPosExpr(op); + @JvmStatic + fun create(op: Expr<*>) = BvPosExpr(TypeUtils.castBv(op)) } - public static BvPosExpr create(final Expr op) { - final Expr newOp = castBv(op); - return BvPosExpr.of(newOp); - } + override val type: BvType get() = op.type - @Override - public BvType getType() { - return getOp().getType(); + override fun eval(`val`: Valuation): BvLitExpr { + val opVal = op.eval(`val`) as BvLitExpr + return opVal.pos() } - @Override - public BvLitExpr eval(final Valuation val) { - final BvLitExpr opVal = (BvLitExpr) getOp().eval(val); - return opVal.pos(); - } + override fun of(op: Expr): BvPosExpr = Companion.of(op) - @Override - public BvPosExpr with(final Expr op) { - if (op == getOp()) { - return this; - } else { - return BvPosExpr.of(op); - } - } + override val operatorLabel: String get() = OPERATOR_LABEL - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final BvPosExpr that = (BvPosExpr) obj; - return this.getOp().equals(that.getOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } + override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvRotateLeftExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvRotateLeftExpr.kt index a61b63aacf..c2986ea688 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvRotateLeftExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvRotateLeftExpr.kt @@ -13,86 +13,45 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.bvtype; -import static hu.bme.mit.theta.core.utils.TypeUtils.castBv; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; +package hu.bme.mit.theta.core.type.bvtype -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.BinaryExpr; -import hu.bme.mit.theta.core.type.Expr; +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.BinaryExpr +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.utils.TypeUtils +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -public final class BvRotateLeftExpr extends BinaryExpr { +@Serializable +@SerialName("BvRotateLeft") +data class BvRotateLeftExpr( + override val leftOp: Expr, + override val rightOp: Expr +) : BinaryExpr() { - private static final int HASH_SEED = 4282; - private static final String OPERATOR_LABEL = "bvrol"; + companion object { + private const val OPERATOR_LABEL = "bvrol" - private BvRotateLeftExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - checkAllTypesEqual(leftOp, rightOp); - } - - public static BvRotateLeftExpr of(final Expr leftOp, final Expr rightOp) { - return new BvRotateLeftExpr(leftOp, rightOp); - } - - public static BvRotateLeftExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = castBv(leftOp); - final Expr newRightOp = castBv(rightOp); - return BvRotateLeftExpr.of(newLeftOp, newRightOp); - } - - @Override - public BvType getType() { - return getOps().get(0).getType(); - } + @JvmStatic + fun of(leftOp: Expr, rightOp: Expr) = BvRotateLeftExpr(leftOp, rightOp) - @Override - public BvLitExpr eval(final Valuation val) { - final BvLitExpr leftOpVal = (BvLitExpr) getLeftOp().eval(val); - final BvLitExpr rightOpVal = (BvLitExpr) getRightOp().eval(val); - return leftOpVal.rotateLeft(rightOpVal); + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = BvRotateLeftExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) } - @Override - public BvRotateLeftExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return BvRotateLeftExpr.of(leftOp, rightOp); - } - } + override val type: BvType get() = leftOp.type - @Override - public BvRotateLeftExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); + override fun eval(`val`: Valuation): BvLitExpr { + val leftOpVal = leftOp.eval(`val`) as BvLitExpr + val rightOpVal = rightOp.eval(`val`) as BvLitExpr + return leftOpVal.rotateLeft(rightOpVal) } - @Override - public BvRotateLeftExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } + override fun of(leftOp: Expr, rightOp: Expr): BvRotateLeftExpr = Companion.of(leftOp, rightOp) - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final BvRotateLeftExpr that = (BvRotateLeftExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } + override val operatorLabel: String get() = OPERATOR_LABEL - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } + override fun toString(): String = super.toString() } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvRotateRightExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvRotateRightExpr.kt index 5aaa5acb4f..80bad83ecb 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvRotateRightExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvRotateRightExpr.kt @@ -13,86 +13,45 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.bvtype; -import static hu.bme.mit.theta.core.utils.TypeUtils.castBv; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; +package hu.bme.mit.theta.core.type.bvtype -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.BinaryExpr; -import hu.bme.mit.theta.core.type.Expr; +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.BinaryExpr +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.utils.TypeUtils +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -public final class BvRotateRightExpr extends BinaryExpr { +@Serializable +@SerialName("BvRotateRight") +data class BvRotateRightExpr( + override val leftOp: Expr, + override val rightOp: Expr +) : BinaryExpr() { - private static final int HASH_SEED = 2564; - private static final String OPERATOR_LABEL = "bvror"; + companion object { + private const val OPERATOR_LABEL = "bvror" - private BvRotateRightExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - checkAllTypesEqual(leftOp, rightOp); - } - - public static BvRotateRightExpr of(final Expr leftOp, final Expr rightOp) { - return new BvRotateRightExpr(leftOp, rightOp); - } - - public static BvRotateRightExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = castBv(leftOp); - final Expr newRightOp = castBv(rightOp); - return BvRotateRightExpr.of(newLeftOp, newRightOp); - } - - @Override - public BvType getType() { - return getOps().get(0).getType(); - } + @JvmStatic + fun of(leftOp: Expr, rightOp: Expr) = BvRotateRightExpr(leftOp, rightOp) - @Override - public BvLitExpr eval(final Valuation val) { - final BvLitExpr leftOpVal = (BvLitExpr) getLeftOp().eval(val); - final BvLitExpr rightOpVal = (BvLitExpr) getRightOp().eval(val); - return leftOpVal.rotateRight(rightOpVal); + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = BvRotateRightExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) } - @Override - public BvRotateRightExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return BvRotateRightExpr.of(leftOp, rightOp); - } - } + override val type: BvType get() = leftOp.type - @Override - public BvRotateRightExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); + override fun eval(`val`: Valuation): BvLitExpr { + val leftOpVal = leftOp.eval(`val`) as BvLitExpr + val rightOpVal = rightOp.eval(`val`) as BvLitExpr + return leftOpVal.rotateRight(rightOpVal) } - @Override - public BvRotateRightExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } + override fun of(leftOp: Expr, rightOp: Expr): BvRotateRightExpr = Companion.of(leftOp, rightOp) - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final BvRotateRightExpr that = (BvRotateRightExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } + override val operatorLabel: String get() = OPERATOR_LABEL - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } + override fun toString(): String = super.toString() } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSDivExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSDivExpr.kt index d562041f00..6642440fa4 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSDivExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSDivExpr.kt @@ -13,88 +13,37 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.bvtype; -import static hu.bme.mit.theta.core.utils.TypeUtils.castBv; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.DivExpr; - -public final class BvSDivExpr extends DivExpr { - - private static final int HASH_SEED = 9830; - - private static final String OPERATOR_LABEL = "bvsdiv"; - - private BvSDivExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - checkAllTypesEqual(leftOp, rightOp); - } - - public static BvSDivExpr of(final Expr leftOp, final Expr rightOp) { - return new BvSDivExpr(leftOp, rightOp); - } - - public static BvSDivExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = castBv(leftOp); - final Expr newRightOp = castBv(rightOp); - return BvSDivExpr.of(newLeftOp, newRightOp); - } - - @Override - public BvType getType() { - return getOps().get(0).getType(); - } - - @Override - public BvLitExpr eval(final Valuation val) { - final BvLitExpr leftOpVal = (BvLitExpr) getLeftOp().eval(val); - final BvLitExpr rightOpVal = (BvLitExpr) getRightOp().eval(val); - - return leftOpVal.sdiv(rightOpVal); - } - - @Override - public BvSDivExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return BvSDivExpr.of(leftOp, rightOp); - } - } - - @Override - public BvSDivExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } - - @Override - public BvSDivExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final BvSDivExpr that = (BvSDivExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } +package hu.bme.mit.theta.core.type.bvtype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.DivExpr +import hu.bme.mit.theta.core.utils.TypeUtils +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("BvSDiv") +data class BvSDivExpr( + override val leftOp: Expr, + override val rightOp: Expr +) : DivExpr() { + companion object { + private const val OPERATOR_LABEL = "bvsdiv" + + @JvmStatic + fun of(leftOp: Expr, rightOp: Expr) = BvSDivExpr(leftOp, rightOp) + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = BvSDivExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) + } + override val type: BvType get() = leftOp.type + override fun eval(`val`: Valuation): BvLitExpr { + val leftOpVal = leftOp.eval(`val`) as BvLitExpr + val rightOpVal = rightOp.eval(`val`) as BvLitExpr + return leftOpVal.sdiv(rightOpVal) + } + override fun of(leftOp: Expr, rightOp: Expr): BvSDivExpr = Companion.of(leftOp, rightOp) + override val operatorLabel: String get() = OPERATOR_LABEL + override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSExtExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSExtExpr.kt index fe0eebe8b0..e099f5ab98 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSExtExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSExtExpr.kt @@ -13,113 +13,52 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.bvtype; -import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.base.Preconditions.checkNotNull; -import static hu.bme.mit.theta.core.utils.TypeUtils.castBv; +package hu.bme.mit.theta.core.type.bvtype -import com.google.common.collect.ImmutableList; -import hu.bme.mit.theta.common.Utils; -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.LitExpr; -import java.util.List; +import hu.bme.mit.theta.common.Utils +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.utils.TypeUtils.castBv +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -public final class BvSExtExpr implements Expr { +@Serializable +@SerialName("BvSExt") +data class BvSExtExpr( + val op: Expr, + val extendType: BvType +) : Expr { - private static final int HASH_SEED = 6126; - private static final String OPERATOR_LABEL = "bv_sign_extend"; + companion object { - private final Expr op; - private final BvType extendType; + private const val OPERATOR_LABEL = "bv_sign_extend" - private volatile int hashCode = 0; + @JvmStatic + fun of(op: Expr, extendType: BvType) = BvSExtExpr(op, extendType) - private BvSExtExpr(final Expr op, final BvType extendType) { - checkNotNull(op); - checkNotNull(extendType); - checkArgument(extendType.getSize() >= op.getType().getSize()); - - this.op = op; - this.extendType = extendType; - } - - public static BvSExtExpr of(final Expr op, final BvType extendType) { - return new BvSExtExpr(op, extendType); - } - - public static BvSExtExpr create(final Expr op, final BvType extendType) { - return new BvSExtExpr(castBv(op), extendType); - } - - public Expr getOp() { - return op; - } - - public BvType getExtendType() { - return extendType; - } - - @Override - public int getArity() { - return 1; + @JvmStatic + fun create(op: Expr<*>, extendType: BvType) = BvSExtExpr(castBv(op), extendType) } - @Override - public BvType getType() { - return extendType; + override val arity: Int = 1 + override val type: BvType = extendType + override val ops: List> = listOf(op) + override fun eval(`val`: Valuation): LitExpr { + val bvLitExpr = op.eval(`val`) as BvLitExpr + return bvLitExpr.sext(extendType) } - @Override - public LitExpr eval(Valuation val) { - final BvLitExpr bvLitExpr = (BvLitExpr) op.eval(val); - return bvLitExpr.sext(extendType); + override fun withOps(ops: List>): Expr { + require(ops.size == 1) + return of(castBv(ops[0]), extendType) } - @Override - public List> getOps() { - return ImmutableList.of(op); - } - - @Override - public Expr withOps(List> ops) { - checkNotNull(ops); - checkArgument(ops.size() == 1); - final Expr newBitvec = castBv(ops.get(0)); - return of(newBitvec, extendType); - } - - @Override - public int hashCode() { - int result = hashCode; - if (result == 0) { - result = HASH_SEED; - result = 31 * result + op.hashCode(); - result = 31 * result + extendType.hashCode(); - hashCode = result; - } - return result; - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final BvSExtExpr that = (BvSExtExpr) obj; - return this.getOps().equals(that.getOps()) && this.getType().equals(that.getType()); - } else { - return false; - } - } - - @Override - public String toString() { - return Utils.lispStringBuilder(OPERATOR_LABEL) - .body() - .add(getOp()) - .add(getType()) - .toString(); - } + override fun toString(): String = Utils.lispStringBuilder(OPERATOR_LABEL) + .body() + .add(op) + .add(type) + .toString() } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSGeqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSGeqExpr.kt index 19df57e9ce..02118b5ca6 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSGeqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSGeqExpr.kt @@ -13,89 +13,45 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.bvtype; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.utils.TypeUtils.castBv; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; +package hu.bme.mit.theta.core.type.bvtype -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.type.abstracttype.GeqExpr; -import hu.bme.mit.theta.core.type.booltype.BoolType; +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.type.abstracttype.GeqExpr +import hu.bme.mit.theta.core.type.booltype.BoolExprs +import hu.bme.mit.theta.core.type.booltype.BoolType +import hu.bme.mit.theta.core.utils.TypeUtils +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -public final class BvSGeqExpr extends GeqExpr { +@Serializable +@SerialName("BvSGeq") +data class BvSGeqExpr( + override val leftOp: Expr, + override val rightOp: Expr +) : GeqExpr() { - private static final int HASH_SEED = 6234; - private static final String OPERATOR_LABEL = "bvsge"; + companion object { - private BvSGeqExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - checkAllTypesEqual(leftOp, rightOp); - } - - public static BvSGeqExpr of(final Expr leftOp, final Expr rightOp) { - return new BvSGeqExpr(leftOp, rightOp); - } - - public static BvSGeqExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = castBv(leftOp); - final Expr newRightOp = castBv(rightOp); - return BvSGeqExpr.of(newLeftOp, newRightOp); - } - - @Override - public BoolType getType() { - return Bool(); - } - - @Override - public LitExpr eval(final Valuation val) { - final BvLitExpr leftOpVal = (BvLitExpr) getLeftOp().eval(val); - final BvLitExpr rightOpVal = (BvLitExpr) getRightOp().eval(val); - return leftOpVal.sge(rightOpVal); - } - - @Override - public BvSGeqExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return BvSGeqExpr.of(leftOp, rightOp); - } - } - - @Override - public BvSGeqExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } + private const val OPERATOR_LABEL = "bvsge" - @Override - public BvSGeqExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } + @JvmStatic + fun of(leftOp: Expr, rightOp: Expr) = BvSGeqExpr(leftOp, rightOp) - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final BvSGeqExpr that = (BvSGeqExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = BvSGeqExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) } - @Override - protected int getHashSeed() { - return HASH_SEED; + override fun eval(`val`: Valuation): LitExpr { + val leftOpVal = leftOp.eval(`val`) as BvLitExpr + val rightOpVal = rightOp.eval(`val`) as BvLitExpr + return leftOpVal.sge(rightOpVal) } - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } + override fun of(leftOp: Expr, rightOp: Expr): BvSGeqExpr = Companion.of(leftOp, rightOp) + override val operatorLabel: String get() = OPERATOR_LABEL + override fun toString(): String = super.toString() } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSGtExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSGtExpr.kt index 7200247f8d..188772ddbc 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSGtExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSGtExpr.kt @@ -13,89 +13,44 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.bvtype; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.utils.TypeUtils.castBv; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; +package hu.bme.mit.theta.core.type.bvtype -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.type.abstracttype.GtExpr; -import hu.bme.mit.theta.core.type.booltype.BoolType; +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.type.abstracttype.GtExpr +import hu.bme.mit.theta.core.type.booltype.BoolType +import hu.bme.mit.theta.core.utils.TypeUtils +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -public final class BvSGtExpr extends GtExpr { +@Serializable +@SerialName("BvSGt") +data class BvSGtExpr( + override val leftOp: Expr, + override val rightOp: Expr +) : GtExpr() { - private static final int HASH_SEED = 6231; - private static final String OPERATOR_LABEL = "bvsgt"; + companion object { - private BvSGtExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - checkAllTypesEqual(leftOp, rightOp); - } - - public static BvSGtExpr of(final Expr leftOp, final Expr rightOp) { - return new BvSGtExpr(leftOp, rightOp); - } - - public static BvSGtExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = castBv(leftOp); - final Expr newRightOp = castBv(rightOp); - return BvSGtExpr.of(newLeftOp, newRightOp); - } - - @Override - public BoolType getType() { - return Bool(); - } - - @Override - public LitExpr eval(final Valuation val) { - final BvLitExpr leftOpVal = (BvLitExpr) getLeftOp().eval(val); - final BvLitExpr rightOpVal = (BvLitExpr) getRightOp().eval(val); - return leftOpVal.sgt(rightOpVal); - } - - @Override - public BvSGtExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return BvSGtExpr.of(leftOp, rightOp); - } - } - - @Override - public BvSGtExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } + private const val OPERATOR_LABEL = "bvsgt" - @Override - public BvSGtExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } + @JvmStatic + fun of(leftOp: Expr, rightOp: Expr) = BvSGtExpr(leftOp, rightOp) - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final BvSGtExpr that = (BvSGtExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = BvSGtExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) } - @Override - protected int getHashSeed() { - return HASH_SEED; + override fun eval(`val`: Valuation): LitExpr { + val leftOpVal = leftOp.eval(`val`) as BvLitExpr + val rightOpVal = rightOp.eval(`val`) as BvLitExpr + return leftOpVal.sgt(rightOpVal) } - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } + override fun of(leftOp: Expr, rightOp: Expr): BvSGtExpr = Companion.of(leftOp, rightOp) + override val operatorLabel: String get() = OPERATOR_LABEL + override fun toString(): String = super.toString() } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSLeqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSLeqExpr.kt index ff70b42471..00a43d4f16 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSLeqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSLeqExpr.kt @@ -13,89 +13,44 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.bvtype; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.utils.TypeUtils.castBv; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; +package hu.bme.mit.theta.core.type.bvtype -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.type.abstracttype.LeqExpr; -import hu.bme.mit.theta.core.type.booltype.BoolType; +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.type.abstracttype.LeqExpr +import hu.bme.mit.theta.core.type.booltype.BoolType +import hu.bme.mit.theta.core.utils.TypeUtils +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -public final class BvSLeqExpr extends LeqExpr { +@Serializable +@SerialName("BvSLeq") +data class BvSLeqExpr( + override val leftOp: Expr, + override val rightOp: Expr +) : LeqExpr() { - private static final int HASH_SEED = 1458; - private static final String OPERATOR_LABEL = "bvsle"; + companion object { - private BvSLeqExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - checkAllTypesEqual(leftOp, rightOp); - } - - public static BvSLeqExpr of(final Expr leftOp, final Expr rightOp) { - return new BvSLeqExpr(leftOp, rightOp); - } - - public static BvSLeqExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = castBv(leftOp); - final Expr newRightOp = castBv(rightOp); - return BvSLeqExpr.of(newLeftOp, newRightOp); - } - - @Override - public BoolType getType() { - return Bool(); - } - - @Override - public LitExpr eval(final Valuation val) { - final BvLitExpr leftOpVal = (BvLitExpr) getLeftOp().eval(val); - final BvLitExpr rightOpVal = (BvLitExpr) getRightOp().eval(val); - return leftOpVal.sle(rightOpVal); - } - - @Override - public BvSLeqExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return BvSLeqExpr.of(leftOp, rightOp); - } - } - - @Override - public BvSLeqExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } + private const val OPERATOR_LABEL = "bvsle" - @Override - public BvSLeqExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } + @JvmStatic + fun of(leftOp: Expr, rightOp: Expr) = BvSLeqExpr(leftOp, rightOp) - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final BvSLeqExpr that = (BvSLeqExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = BvSLeqExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) } - @Override - protected int getHashSeed() { - return HASH_SEED; + override fun eval(`val`: Valuation): LitExpr { + val leftOpVal = leftOp.eval(`val`) as BvLitExpr + val rightOpVal = rightOp.eval(`val`) as BvLitExpr + return leftOpVal.sle(rightOpVal) } - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } + override fun of(leftOp: Expr, rightOp: Expr): BvSLeqExpr = Companion.of(leftOp, rightOp) + override val operatorLabel: String get() = OPERATOR_LABEL + override fun toString(): String = super.toString() } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSLtExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSLtExpr.kt index 163a9e2aea..6dba445356 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSLtExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSLtExpr.kt @@ -13,89 +13,44 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.bvtype; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.utils.TypeUtils.castBv; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; +package hu.bme.mit.theta.core.type.bvtype -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.type.abstracttype.LtExpr; -import hu.bme.mit.theta.core.type.booltype.BoolType; +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.type.abstracttype.LtExpr +import hu.bme.mit.theta.core.type.booltype.BoolType +import hu.bme.mit.theta.core.utils.TypeUtils +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -public final class BvSLtExpr extends LtExpr { +@Serializable +@SerialName("BvSLt") +data class BvSLtExpr( + override val leftOp: Expr, + override val rightOp: Expr +) : LtExpr() { - private static final int HASH_SEED = 2798; - private static final String OPERATOR_LABEL = "bvslt"; + companion object { - private BvSLtExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - checkAllTypesEqual(leftOp, rightOp); - } - - public static BvSLtExpr of(final Expr leftOp, final Expr rightOp) { - return new BvSLtExpr(leftOp, rightOp); - } - - public static BvSLtExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = castBv(leftOp); - final Expr newRightOp = castBv(rightOp); - return BvSLtExpr.of(newLeftOp, newRightOp); - } - - @Override - public BoolType getType() { - return Bool(); - } - - @Override - public LitExpr eval(final Valuation val) { - final BvLitExpr leftOpVal = (BvLitExpr) getLeftOp().eval(val); - final BvLitExpr rightOpVal = (BvLitExpr) getRightOp().eval(val); - return leftOpVal.slt(rightOpVal); - } - - @Override - public BvSLtExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return BvSLtExpr.of(leftOp, rightOp); - } - } - - @Override - public BvSLtExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } + private const val OPERATOR_LABEL = "bvslt" - @Override - public BvSLtExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } + @JvmStatic + fun of(leftOp: Expr, rightOp: Expr) = BvSLtExpr(leftOp, rightOp) - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final BvSLtExpr that = (BvSLtExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = BvSLtExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) } - @Override - protected int getHashSeed() { - return HASH_SEED; + override fun eval(`val`: Valuation): LitExpr { + val leftOpVal = leftOp.eval(`val`) as BvLitExpr + val rightOpVal = rightOp.eval(`val`) as BvLitExpr + return leftOpVal.slt(rightOpVal) } - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } + override fun of(leftOp: Expr, rightOp: Expr): BvSLtExpr = Companion.of(leftOp, rightOp) + override val operatorLabel: String get() = OPERATOR_LABEL + override fun toString(): String = super.toString() } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSModExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSModExpr.kt index 207f4b8578..2d6844289b 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSModExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSModExpr.kt @@ -13,86 +13,37 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.bvtype; -import static hu.bme.mit.theta.core.utils.TypeUtils.castBv; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.ModExpr; - -public final class BvSModExpr extends ModExpr { - - private static final int HASH_SEED = 1451; - private static final String OPERATOR_LABEL = "bvsmod"; - - private BvSModExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - checkAllTypesEqual(leftOp, rightOp); - } - - public static BvSModExpr of(final Expr leftOp, final Expr rightOp) { - return new BvSModExpr(leftOp, rightOp); - } - - public static BvSModExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = castBv(leftOp); - final Expr newRightOp = castBv(rightOp); - return BvSModExpr.of(newLeftOp, newRightOp); - } - - @Override - public BvType getType() { - return getOps().get(0).getType(); - } - - @Override - public BvLitExpr eval(final Valuation val) { - final BvLitExpr leftOpVal = (BvLitExpr) getLeftOp().eval(val); - final BvLitExpr rightOpVal = (BvLitExpr) getRightOp().eval(val); - return leftOpVal.smod(rightOpVal); - } - - @Override - public BvSModExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return BvSModExpr.of(leftOp, rightOp); - } - } - - @Override - public BvSModExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } - - @Override - public BvSModExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final BvSModExpr that = (BvSModExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } +package hu.bme.mit.theta.core.type.bvtype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.ModExpr +import hu.bme.mit.theta.core.utils.TypeUtils +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("BvSMod") +data class BvSModExpr( + override val leftOp: Expr, + override val rightOp: Expr +) : ModExpr() { + companion object { + private const val OPERATOR_LABEL = "bvsmod" + + @JvmStatic + fun of(leftOp: Expr, rightOp: Expr) = BvSModExpr(leftOp, rightOp) + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = BvSModExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) + } + override val type: BvType get() = leftOp.type + override fun eval(`val`: Valuation): BvLitExpr { + val leftOpVal = leftOp.eval(`val`) as BvLitExpr + val rightOpVal = rightOp.eval(`val`) as BvLitExpr + return leftOpVal.smod(rightOpVal) + } + override fun of(leftOp: Expr, rightOp: Expr): BvSModExpr = Companion.of(leftOp, rightOp) + override val operatorLabel: String get() = OPERATOR_LABEL + override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSRemExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSRemExpr.kt index 9741aa6ae0..6f101728c5 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSRemExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSRemExpr.kt @@ -13,87 +13,38 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.bvtype; -import static hu.bme.mit.theta.core.utils.TypeUtils.castBv; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.RemExpr; - -public final class BvSRemExpr extends RemExpr { - - private static final int HASH_SEED = 985; - - private static final String OPERATOR_LABEL = "bvsrem"; - - private BvSRemExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - checkAllTypesEqual(leftOp, rightOp); - } - - public static BvSRemExpr of(final Expr leftOp, final Expr rightOp) { - return new BvSRemExpr(leftOp, rightOp); - } - - public static BvSRemExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = castBv(leftOp); - final Expr newRightOp = castBv(rightOp); - return BvSRemExpr.of(newLeftOp, newRightOp); - } - - @Override - public BvType getType() { - return getOps().get(0).getType(); - } - - @Override - public BvLitExpr eval(final Valuation val) { - final BvLitExpr leftOpVal = (BvLitExpr) getLeftOp().eval(val); - final BvLitExpr rightOpVal = (BvLitExpr) getRightOp().eval(val); - return leftOpVal.srem(rightOpVal); - } - - @Override - public BvSRemExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return BvSRemExpr.of(leftOp, rightOp); - } - } - - @Override - public BvSRemExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } - - @Override - public BvSRemExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final BvSRemExpr that = (BvSRemExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } +package hu.bme.mit.theta.core.type.bvtype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.RemExpr +import hu.bme.mit.theta.core.utils.TypeUtils +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("BvSRem") +data class BvSRemExpr( + override val leftOp: Expr, + override val rightOp: Expr +) : RemExpr() { + companion object { + private const val OPERATOR_LABEL = "bvsrem" + + @JvmStatic + fun of(leftOp: Expr, rightOp: Expr) = BvSRemExpr(leftOp, rightOp) + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = BvSRemExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) + } + override val type: BvType get() = leftOp.type + override fun eval(`val`: Valuation): BvLitExpr { + val leftOpVal = leftOp.eval(`val`) as BvLitExpr + val rightOpVal = rightOp.eval(`val`) as BvLitExpr + return leftOpVal.srem(rightOpVal) + } + override fun of(leftOp: Expr, rightOp: Expr): BvSRemExpr = Companion.of(leftOp, rightOp) + override val operatorLabel: String get() = OPERATOR_LABEL + override fun toString(): String = super.toString() } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvShiftLeftExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvShiftLeftExpr.kt index 2db425db64..aec27d2ed3 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvShiftLeftExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvShiftLeftExpr.kt @@ -13,86 +13,45 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.bvtype; -import static hu.bme.mit.theta.core.utils.TypeUtils.castBv; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; +package hu.bme.mit.theta.core.type.bvtype -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.BinaryExpr; -import hu.bme.mit.theta.core.type.Expr; +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.BinaryExpr +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.utils.TypeUtils +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -public final class BvShiftLeftExpr extends BinaryExpr { +@Serializable +@SerialName("BvShiftLeft") +data class BvShiftLeftExpr( + override val leftOp: Expr, + override val rightOp: Expr +) : BinaryExpr() { - private static final int HASH_SEED = 4288; - private static final String OPERATOR_LABEL = "bvshl"; + companion object { + private const val OPERATOR_LABEL = "bvshl" - private BvShiftLeftExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - checkAllTypesEqual(leftOp, rightOp); - } - - public static BvShiftLeftExpr of(final Expr leftOp, final Expr rightOp) { - return new BvShiftLeftExpr(leftOp, rightOp); - } - - public static BvShiftLeftExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = castBv(leftOp); - final Expr newRightOp = castBv(rightOp); - return BvShiftLeftExpr.of(newLeftOp, newRightOp); - } - - @Override - public BvType getType() { - return getOps().get(0).getType(); - } + @JvmStatic + fun of(leftOp: Expr, rightOp: Expr) = BvShiftLeftExpr(leftOp, rightOp) - @Override - public BvLitExpr eval(final Valuation val) { - final BvLitExpr leftOpVal = (BvLitExpr) getLeftOp().eval(val); - final BvLitExpr rightOpVal = (BvLitExpr) getRightOp().eval(val); - return leftOpVal.shiftLeft(rightOpVal); + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = BvShiftLeftExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) } - @Override - public BvShiftLeftExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return BvShiftLeftExpr.of(leftOp, rightOp); - } - } + override val type: BvType get() = leftOp.type - @Override - public BvShiftLeftExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); + override fun eval(`val`: Valuation): BvLitExpr { + val leftOpVal = leftOp.eval(`val`) as BvLitExpr + val rightOpVal = rightOp.eval(`val`) as BvLitExpr + return leftOpVal.shiftLeft(rightOpVal) } - @Override - public BvShiftLeftExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } + override fun of(leftOp: Expr, rightOp: Expr): BvShiftLeftExpr = Companion.of(leftOp, rightOp) - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final BvShiftLeftExpr that = (BvShiftLeftExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } + override val operatorLabel: String get() = OPERATOR_LABEL - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } + override fun toString(): String = super.toString() } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSignChangeExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSignChangeExpr.kt index 25fd0a207d..56f5db5c3a 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSignChangeExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSignChangeExpr.kt @@ -13,74 +13,42 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.bvtype; -import static hu.bme.mit.theta.core.utils.TypeUtils.castBv; +package hu.bme.mit.theta.core.type.bvtype -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.PosExpr; +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.PosExpr +import hu.bme.mit.theta.core.utils.TypeUtils +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -public final class BvSignChangeExpr extends PosExpr { +@Serializable +@SerialName("BvSignChange") +data class BvSignChangeExpr( + override val op: Expr, + val newType: BvType +) : PosExpr() { - private static final int HASH_SEED = 8963; - private static final String OPERATOR_LABEL = "bvpos"; + companion object { - private final BvType newType; + private const val OPERATOR_LABEL = "bvpos" - private BvSignChangeExpr(final Expr op, final BvType newType) { - super(op); - this.newType = newType; - } - - public static BvSignChangeExpr of(final Expr op, final BvType newType) { - return new BvSignChangeExpr(op, newType); - } - - public static BvSignChangeExpr create(final Expr op, final BvType newType) { - final Expr newOp = castBv(op); - return BvSignChangeExpr.of(newOp, newType); - } - - @Override - public BvType getType() { - return newType; - } + @JvmStatic + fun of(op: Expr, newType: BvType) = BvSignChangeExpr(op, newType) - @Override - public BvLitExpr eval(final Valuation val) { - final BvLitExpr opVal = (BvLitExpr) getOp().eval(val); - return opVal.pos(); + @JvmStatic + fun create(op: Expr<*>, newType: BvType) = BvSignChangeExpr(TypeUtils.castBv(op), newType) } - @Override - public BvSignChangeExpr with(final Expr op) { - if (op == getOp()) { - return this; - } else { - return BvSignChangeExpr.of(op, newType); - } + override val type: BvType get() = newType + override fun eval(`val`: Valuation): BvLitExpr { + val opVal = op.eval(`val`) as BvLitExpr + return opVal.pos() } - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final BvSignChangeExpr that = (BvSignChangeExpr) obj; - return this.getOp().equals(that.getOp()) && this.getType().equals(that.getType()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } + override fun of(op: Expr): BvSignChangeExpr = Companion.of(op, newType) + override val operatorLabel: String get() = OPERATOR_LABEL + override fun toString(): String = super.toString() } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSubExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSubExpr.kt index 37a5d75509..72f333283d 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSubExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSubExpr.kt @@ -13,87 +13,44 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.bvtype; -import static hu.bme.mit.theta.core.utils.TypeUtils.castBv; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; +package hu.bme.mit.theta.core.type.bvtype -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.SubExpr; +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.SubExpr +import hu.bme.mit.theta.core.utils.TypeUtils +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -public final class BvSubExpr extends SubExpr { +@Serializable +@SerialName("BvSub") +data class BvSubExpr( + override val leftOp: Expr, + override val rightOp: Expr +) : SubExpr() { - private static final int HASH_SEED = 2567; - private static final String OPERATOR = "bvsub"; + companion object { + private const val OPERATOR_LABEL = "bvsub" - private BvSubExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - checkAllTypesEqual(leftOp, rightOp); - } - - public static BvSubExpr of(final Expr leftOp, final Expr rightOp) { - return new BvSubExpr(leftOp, rightOp); - } - - public static BvSubExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = castBv(leftOp); - final Expr newRightOp = castBv(rightOp); - return BvSubExpr.of(newLeftOp, newRightOp); - } - - @Override - public BvType getType() { - return getOps().get(0).getType(); - } + @JvmStatic + fun of(leftOp: Expr, rightOp: Expr) = BvSubExpr(leftOp, rightOp) - @Override - public BvLitExpr eval(final Valuation val) { - final BvLitExpr leftOpVal = (BvLitExpr) getLeftOp().eval(val); - final BvLitExpr rightOpVal = (BvLitExpr) getRightOp().eval(val); - - return leftOpVal.sub(rightOpVal); + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = BvSubExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) } - @Override - public BvSubExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return BvSubExpr.of(leftOp, rightOp); - } - } + override val type: BvType get() = leftOp.type - @Override - public BvSubExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); + override fun eval(`val`: Valuation): BvLitExpr { + val leftOpVal = leftOp.eval(`val`) as BvLitExpr + val rightOpVal = rightOp.eval(`val`) as BvLitExpr + return leftOpVal.sub(rightOpVal) } - @Override - public BvSubExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } + override fun of(leftOp: Expr, rightOp: Expr): BvSubExpr = Companion.of(leftOp, rightOp) - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final BvSubExpr that = (BvSubExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } + override val operatorLabel: String get() = OPERATOR_LABEL - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR; - } + override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvType.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvType.kt index 0db2f871c5..c4ce1e8a46 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvType.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvType.kt @@ -13,205 +13,99 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.bvtype; - -import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.base.Preconditions.checkState; -import static hu.bme.mit.theta.core.type.fptype.FpExprs.FromBv; - -import hu.bme.mit.theta.common.Utils; -import hu.bme.mit.theta.core.type.DomainSize; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.Type; -import hu.bme.mit.theta.core.type.abstracttype.*; -import hu.bme.mit.theta.core.type.fptype.FpRoundingMode; -import hu.bme.mit.theta.core.type.fptype.FpType; -import java.math.BigInteger; - -public class BvType - implements Additive, - Multiplicative, - Divisible, - Equational, - Ordered, - Castable { - - private static final int HASH_SEED = 5674; - private static final String TYPE_LABEL = "Bv"; - - private final int size; - private final Boolean signed; - - private volatile int hashCode = 0; - - protected BvType(final int size, Boolean signed) { - this.signed = signed; - checkArgument(size > 0); - this.size = size; - } - - public static BvType of(final int size) { - return new BvType(size, null); - } - - public static BvType of(final int size, final Boolean signed) { - return new BvType(size, signed); - } - - public BvType withSize(final int size) { - return new BvType(size, signed); - } - public int getSize() { - return size; - } +package hu.bme.mit.theta.core.type.bvtype - public Boolean getSigned() { - checkState(signed != null); - return signed; - } +import hu.bme.mit.theta.common.Utils +import hu.bme.mit.theta.core.type.DomainSize +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.Type +import hu.bme.mit.theta.core.type.abstracttype.* +import hu.bme.mit.theta.core.type.fptype.FpExprs.FromBv +import hu.bme.mit.theta.core.type.fptype.FpRoundingMode +import hu.bme.mit.theta.core.type.fptype.FpType +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import java.math.BigInteger - @Override - public EqExpr Eq(Expr leftOp, Expr rightOp) { - return BvEqExpr.of(leftOp, rightOp); - } +@Serializable +@SerialName(BvType.TYPE_LABEL) +data class BvType( + val size: Int, + val signed: Boolean?, +) : Additive, Multiplicative, Divisible, Equational, Ordered, Castable { - @Override - public NeqExpr Neq(Expr leftOp, Expr rightOp) { - return BvNeqExpr.of(leftOp, rightOp); + init { + require(size > 0) { "Bitvector size must be positive" } } - @Override - public int hashCode() { - int result = hashCode; - if (result == 0) { - result = HASH_SEED; - result = 31 * result + size; - hashCode = result; - } - return result; - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final BvType that = (BvType) obj; - return this.getSize() == that.getSize(); - } else { - return false; - } - } + companion object { - @Override - public String toString() { - return Utils.lispStringBuilder(TYPE_LABEL).add(size).toString(); - } + internal const val TYPE_LABEL = "Bv" - @Override - public AddExpr Add(Iterable> ops) { - return BvExprs.Add(ops); - } + @JvmStatic + fun of(size: Int): BvType = BvType(size, null) - @Override - public SubExpr Sub(Expr leftOp, Expr rightOp) { - return BvExprs.Sub(leftOp, rightOp); + @JvmStatic + fun of(size: Int, signed: Boolean?): BvType = BvType(size, signed) } - @Override - public PosExpr Pos(Expr op) { - return BvExprs.Pos(op); - } + fun withSize(size: Int): BvType = BvType(size, signed) - @Override - public NegExpr Neg(Expr op) { - return BvExprs.Neg(op); - } + fun getSigned(): Boolean = signed ?: error("Signedness is not specified") - @Override - public Expr Cast(Expr op, TargetType type) { - if (type instanceof FpType && signed != null) { - //noinspection unchecked - return (Expr) FromBv(FpRoundingMode.RTZ, op, (FpType) type, signed); + override fun Eq(leftOp: Expr, rightOp: Expr) = BvEqExpr(leftOp, rightOp) + override fun Neq(leftOp: Expr, rightOp: Expr) = BvNeqExpr(leftOp, rightOp) + override fun Add(ops: Iterable>) = BvExprs.Add(ops) + override fun Sub(leftOp: Expr, rightOp: Expr) = BvExprs.Sub(leftOp, rightOp) + override fun Pos(op: Expr) = BvExprs.Pos(op) + override fun Neg(op: Expr) = BvExprs.Neg(op) + override fun Cast(op: Expr, type: TargetType): Expr { + if (type is FpType && signed != null) { + @Suppress("UNCHECKED_CAST") + return FromBv(FpRoundingMode.RTZ, op, type, signed) as Expr } - throw new ClassCastException("Bv cannot be cast to " + type); + throw ClassCastException("Bv cannot be cast to $type") } - @Override - public ModExpr Mod(Expr leftOp, Expr rightOp) { - checkState(signed != null, "Neutral BvType cannot be used here"); - checkState(signed, "Unsigned BvType cannot be used here"); - return BvExprs.SMod(leftOp, rightOp); + override fun Mod(leftOp: Expr, rightOp: Expr): ModExpr { + check(signed != null && signed) { "Signed BvType required for Mod" } + return BvExprs.SMod(leftOp, rightOp) } - @Override - public RemExpr Rem(Expr leftOp, Expr rightOp) { - checkState(signed != null, "Neutral BvType cannot be used here"); - if (signed) { - return BvExprs.SRem(leftOp, rightOp); - } else { - return BvExprs.URem(leftOp, rightOp); - } + override fun Rem(leftOp: Expr, rightOp: Expr): RemExpr { + check(signed != null) { "Neutral BvType cannot be used here" } + return if (signed) BvExprs.SRem(leftOp, rightOp) else BvExprs.URem(leftOp, rightOp) } - @Override - public MulExpr Mul(Iterable> ops) { - return BvExprs.Mul(ops); + override fun Mul(ops: Iterable>) = BvExprs.Mul(ops) + override fun Div(leftOp: Expr, rightOp: Expr): DivExpr { + check(signed != null) { "Neutral BvType cannot be used here" } + return if (signed) BvExprs.SDiv(leftOp, rightOp) else BvExprs.UDiv(leftOp, rightOp) } - @Override - public DivExpr Div(Expr leftOp, Expr rightOp) { - checkState(signed != null, "Neutral BvType cannot be used here"); - if (signed) { - return BvExprs.SDiv(leftOp, rightOp); - } else { - return BvExprs.UDiv(leftOp, rightOp); - } + override fun Lt(leftOp: Expr, rightOp: Expr): LtExpr { + check(signed != null) { "Neutral BvType cannot be used here" } + return if (signed) BvExprs.SLt(leftOp, rightOp) else BvExprs.ULt(leftOp, rightOp) } - @Override - public LtExpr Lt(Expr leftOp, Expr rightOp) { - checkState(signed != null, "Neutral BvType cannot be used here"); - if (signed) { - return BvExprs.SLt(leftOp, rightOp); - } else { - return BvExprs.ULt(leftOp, rightOp); - } + override fun Leq(leftOp: Expr, rightOp: Expr): LeqExpr { + check(signed != null) { "Neutral BvType cannot be used here" } + return if (signed) BvExprs.SLeq(leftOp, rightOp) else BvExprs.ULeq(leftOp, rightOp) } - @Override - public LeqExpr Leq(Expr leftOp, Expr rightOp) { - checkState(signed != null, "Neutral BvType cannot be used here"); - if (signed) { - return BvExprs.SLeq(leftOp, rightOp); - } else { - return BvExprs.ULeq(leftOp, rightOp); - } + override fun Gt(leftOp: Expr, rightOp: Expr): GtExpr { + check(signed != null) { "Neutral BvType cannot be used here" } + return if (signed) BvExprs.SGt(leftOp, rightOp) else BvExprs.UGt(leftOp, rightOp) } - @Override - public GtExpr Gt(Expr leftOp, Expr rightOp) { - checkState(signed != null, "Neutral BvType cannot be used here"); - if (signed) { - return BvExprs.SGt(leftOp, rightOp); - } else { - return BvExprs.UGt(leftOp, rightOp); - } + override fun Geq(leftOp: Expr, rightOp: Expr): GeqExpr { + check(signed != null) { "Neutral BvType cannot be used here" } + return if (signed) BvExprs.SGeq(leftOp, rightOp) else BvExprs.UGeq(leftOp, rightOp) } - @Override - public GeqExpr Geq(Expr leftOp, Expr rightOp) { - checkState(signed != null, "Neutral BvType cannot be used here"); - if (signed) { - return BvExprs.SGeq(leftOp, rightOp); - } else { - return BvExprs.UGeq(leftOp, rightOp); - } - } + override val domainSize: DomainSize get() = DomainSize.of(BigInteger.TWO.pow(size)) - @Override - public DomainSize getDomainSize() { - return DomainSize.of(BigInteger.TWO.pow(size)); - } + override fun toString(): String = Utils.lispStringBuilder(TYPE_LABEL).add(size).toString() } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvUDivExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvUDivExpr.kt index 8e2f0ae196..8f3598f448 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvUDivExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvUDivExpr.kt @@ -13,88 +13,38 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.bvtype; -import static hu.bme.mit.theta.core.utils.TypeUtils.castBv; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.DivExpr; - -public final class BvUDivExpr extends DivExpr { - - private static final int HASH_SEED = 9832; - - private static final String OPERATOR_LABEL = "bvudiv"; - - private BvUDivExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - checkAllTypesEqual(leftOp, rightOp); - } - - public static BvUDivExpr of(final Expr leftOp, final Expr rightOp) { - return new BvUDivExpr(leftOp, rightOp); - } - - public static BvUDivExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = castBv(leftOp); - final Expr newRightOp = castBv(rightOp); - return BvUDivExpr.of(newLeftOp, newRightOp); - } - - @Override - public BvType getType() { - return getOps().get(0).getType(); - } - - @Override - public BvLitExpr eval(final Valuation val) { - final BvLitExpr leftOpVal = (BvLitExpr) getLeftOp().eval(val); - final BvLitExpr rightOpVal = (BvLitExpr) getRightOp().eval(val); - - return leftOpVal.udiv(rightOpVal); - } - - @Override - public BvUDivExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return BvUDivExpr.of(leftOp, rightOp); - } - } - - @Override - public BvUDivExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } - - @Override - public BvUDivExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final BvUDivExpr that = (BvUDivExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } +package hu.bme.mit.theta.core.type.bvtype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.DivExpr +import hu.bme.mit.theta.core.utils.TypeUtils +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("BvUDiv") +data class BvUDivExpr( + override val leftOp: Expr, + override val rightOp: Expr +) : DivExpr() { + companion object { + private const val OPERATOR_LABEL = "bvudiv" + + @JvmStatic + fun of(leftOp: Expr, rightOp: Expr) = BvUDivExpr(leftOp, rightOp) + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = BvUDivExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) + } + override val type: BvType get() = leftOp.type + override fun eval(`val`: Valuation): BvLitExpr { + val leftOpVal = leftOp.eval(`val`) as BvLitExpr + val rightOpVal = rightOp.eval(`val`) as BvLitExpr + return leftOpVal.udiv(rightOpVal) + } + override fun of(leftOp: Expr, rightOp: Expr): BvUDivExpr = Companion.of(leftOp, rightOp) + override val operatorLabel: String get() = OPERATOR_LABEL + override fun toString(): String = super.toString() } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvUGeqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvUGeqExpr.kt index 75e5aa7ac4..6906483f45 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvUGeqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvUGeqExpr.kt @@ -13,89 +13,45 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.bvtype; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.utils.TypeUtils.castBv; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; +package hu.bme.mit.theta.core.type.bvtype -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.type.abstracttype.GeqExpr; -import hu.bme.mit.theta.core.type.booltype.BoolType; +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.type.abstracttype.GeqExpr +import hu.bme.mit.theta.core.type.booltype.BoolType +import hu.bme.mit.theta.core.utils.TypeUtils +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -public final class BvUGeqExpr extends GeqExpr { - private static final int HASH_SEED = 6234; - private static final String OPERATOR_LABEL = "bvuge"; +@Serializable +@SerialName("BvUGeq") +data class BvUGeqExpr( + override val leftOp: Expr, + override val rightOp: Expr +) : GeqExpr() { - private BvUGeqExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - checkAllTypesEqual(leftOp, rightOp); - } - - public static BvUGeqExpr of(final Expr leftOp, final Expr rightOp) { - return new BvUGeqExpr(leftOp, rightOp); - } - - public static BvUGeqExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = castBv(leftOp); - final Expr newRightOp = castBv(rightOp); - return BvUGeqExpr.of(newLeftOp, newRightOp); - } + companion object { - @Override - public BoolType getType() { - return Bool(); - } + private const val OPERATOR_LABEL = "bvuge" - @Override - public LitExpr eval(final Valuation val) { - final BvLitExpr leftOpVal = (BvLitExpr) getLeftOp().eval(val); - final BvLitExpr rightOpVal = (BvLitExpr) getRightOp().eval(val); - return leftOpVal.uge(rightOpVal); - } + @JvmStatic + fun of(leftOp: Expr, rightOp: Expr) = BvUGeqExpr(leftOp, rightOp) - @Override - public BvUGeqExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return BvUGeqExpr.of(leftOp, rightOp); - } + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = BvUGeqExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) } - @Override - public BvUGeqExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); + override fun eval(`val`: Valuation): LitExpr { + val leftOpVal = leftOp.eval(`val`) as BvLitExpr + val rightOpVal = rightOp.eval(`val`) as BvLitExpr + return leftOpVal.uge(rightOpVal) } - @Override - public BvUGeqExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final BvUGeqExpr that = (BvUGeqExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } + override fun of(leftOp: Expr, rightOp: Expr): BvUGeqExpr = Companion.of(leftOp, rightOp) + override val operatorLabel: String get() = OPERATOR_LABEL + override fun toString(): String = super.toString() } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvUGtExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvUGtExpr.kt index 73f475896c..cd20df4b09 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvUGtExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvUGtExpr.kt @@ -13,89 +13,44 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.bvtype; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.utils.TypeUtils.castBv; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; +package hu.bme.mit.theta.core.type.bvtype -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.type.abstracttype.GtExpr; -import hu.bme.mit.theta.core.type.booltype.BoolType; +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.type.abstracttype.GtExpr +import hu.bme.mit.theta.core.type.booltype.BoolType +import hu.bme.mit.theta.core.utils.TypeUtils +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -public final class BvUGtExpr extends GtExpr { +@Serializable +@SerialName("BvUGt") +data class BvUGtExpr( + override val leftOp: Expr, + override val rightOp: Expr +) : GtExpr() { - private static final int HASH_SEED = 6231; - private static final String OPERATOR_LABEL = "bvugt"; + companion object { - private BvUGtExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - checkAllTypesEqual(leftOp, rightOp); - } - - public static BvUGtExpr of(final Expr leftOp, final Expr rightOp) { - return new BvUGtExpr(leftOp, rightOp); - } - - public static BvUGtExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = castBv(leftOp); - final Expr newRightOp = castBv(rightOp); - return BvUGtExpr.of(newLeftOp, newRightOp); - } - - @Override - public BoolType getType() { - return Bool(); - } - - @Override - public LitExpr eval(final Valuation val) { - final BvLitExpr leftOpVal = (BvLitExpr) getLeftOp().eval(val); - final BvLitExpr rightOpVal = (BvLitExpr) getRightOp().eval(val); - return leftOpVal.ugt(rightOpVal); - } - - @Override - public BvUGtExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return BvUGtExpr.of(leftOp, rightOp); - } - } - - @Override - public BvUGtExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } + private const val OPERATOR_LABEL = "bvugt" - @Override - public BvUGtExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } + @JvmStatic + fun of(leftOp: Expr, rightOp: Expr) = BvUGtExpr(leftOp, rightOp) - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final BvUGtExpr that = (BvUGtExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = BvUGtExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) } - @Override - protected int getHashSeed() { - return HASH_SEED; + override fun eval(`val`: Valuation): LitExpr { + val leftOpVal = leftOp.eval(`val`) as BvLitExpr + val rightOpVal = rightOp.eval(`val`) as BvLitExpr + return leftOpVal.ugt(rightOpVal) } - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } + override fun of(leftOp: Expr, rightOp: Expr): BvUGtExpr = Companion.of(leftOp, rightOp) + override val operatorLabel: String get() = OPERATOR_LABEL + override fun toString(): String = super.toString() } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvULeqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvULeqExpr.kt index 4fbf91b875..b6afbabaa6 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvULeqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvULeqExpr.kt @@ -13,89 +13,44 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.bvtype; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.utils.TypeUtils.castBv; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; +package hu.bme.mit.theta.core.type.bvtype -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.type.abstracttype.LeqExpr; -import hu.bme.mit.theta.core.type.booltype.BoolType; +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.type.abstracttype.LeqExpr +import hu.bme.mit.theta.core.type.booltype.BoolType +import hu.bme.mit.theta.core.utils.TypeUtils +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -public final class BvULeqExpr extends LeqExpr { +@Serializable +@SerialName("BvULeq") +data class BvULeqExpr( + override val leftOp: Expr, + override val rightOp: Expr +) : LeqExpr() { - private static final int HASH_SEED = 1458; - private static final String OPERATOR_LABEL = "bvule"; + companion object { - private BvULeqExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - checkAllTypesEqual(leftOp, rightOp); - } - - public static BvULeqExpr of(final Expr leftOp, final Expr rightOp) { - return new BvULeqExpr(leftOp, rightOp); - } - - public static BvULeqExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = castBv(leftOp); - final Expr newRightOp = castBv(rightOp); - return BvULeqExpr.of(newLeftOp, newRightOp); - } - - @Override - public BoolType getType() { - return Bool(); - } - - @Override - public LitExpr eval(final Valuation val) { - final BvLitExpr leftOpVal = (BvLitExpr) getLeftOp().eval(val); - final BvLitExpr rightOpVal = (BvLitExpr) getRightOp().eval(val); - return leftOpVal.ule(rightOpVal); - } - - @Override - public BvULeqExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return BvULeqExpr.of(leftOp, rightOp); - } - } - - @Override - public BvULeqExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } + private const val OPERATOR_LABEL = "bvule" - @Override - public BvULeqExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } + @JvmStatic + fun of(leftOp: Expr, rightOp: Expr) = BvULeqExpr(leftOp, rightOp) - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final BvULeqExpr that = (BvULeqExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = BvULeqExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) } - @Override - protected int getHashSeed() { - return HASH_SEED; + override fun eval(`val`: Valuation): LitExpr { + val leftOpVal = leftOp.eval(`val`) as BvLitExpr + val rightOpVal = rightOp.eval(`val`) as BvLitExpr + return leftOpVal.ule(rightOpVal) } - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } + override fun of(leftOp: Expr, rightOp: Expr): BvULeqExpr = Companion.of(leftOp, rightOp) + override val operatorLabel: String get() = OPERATOR_LABEL + override fun toString(): String = super.toString() } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvULtExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvULtExpr.kt index ba97949df5..7915de3a00 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvULtExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvULtExpr.kt @@ -13,89 +13,45 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.bvtype; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.utils.TypeUtils.castBv; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; +package hu.bme.mit.theta.core.type.bvtype -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.type.abstracttype.LtExpr; -import hu.bme.mit.theta.core.type.booltype.BoolType; +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.type.abstracttype.LtExpr +import hu.bme.mit.theta.core.type.booltype.BoolExprs +import hu.bme.mit.theta.core.type.booltype.BoolType +import hu.bme.mit.theta.core.utils.TypeUtils +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -public final class BvULtExpr extends LtExpr { +@Serializable +@SerialName("BvULt") +data class BvULtExpr( + override val leftOp: Expr, + override val rightOp: Expr +) : LtExpr() { - private static final int HASH_SEED = 2798; - private static final String OPERATOR_LABEL = "bvult"; + companion object { - private BvULtExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - checkAllTypesEqual(leftOp, rightOp); - } - - public static BvULtExpr of(final Expr leftOp, final Expr rightOp) { - return new BvULtExpr(leftOp, rightOp); - } - - public static BvULtExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = castBv(leftOp); - final Expr newRightOp = castBv(rightOp); - return BvULtExpr.of(newLeftOp, newRightOp); - } - - @Override - public BoolType getType() { - return Bool(); - } - - @Override - public LitExpr eval(final Valuation val) { - final BvLitExpr leftOpVal = (BvLitExpr) getLeftOp().eval(val); - final BvLitExpr rightOpVal = (BvLitExpr) getRightOp().eval(val); - return leftOpVal.ult(rightOpVal); - } - - @Override - public BvULtExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return BvULtExpr.of(leftOp, rightOp); - } - } - - @Override - public BvULtExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } + private const val OPERATOR_LABEL = "bvult" - @Override - public BvULtExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } + @JvmStatic + fun of(leftOp: Expr, rightOp: Expr) = BvULtExpr(leftOp, rightOp) - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final BvULtExpr that = (BvULtExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = BvULtExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) } - @Override - protected int getHashSeed() { - return HASH_SEED; + override fun eval(`val`: Valuation): LitExpr { + val leftOpVal = leftOp.eval(`val`) as BvLitExpr + val rightOpVal = rightOp.eval(`val`) as BvLitExpr + return leftOpVal.ult(rightOpVal) } - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } + override fun of(leftOp: Expr, rightOp: Expr): BvULtExpr = Companion.of(leftOp, rightOp) + override val operatorLabel: String get() = OPERATOR_LABEL + override fun toString(): String = super.toString() } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvURemExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvURemExpr.kt index 784c1eee29..c45b6d445f 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvURemExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvURemExpr.kt @@ -13,87 +13,38 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.bvtype; -import static hu.bme.mit.theta.core.utils.TypeUtils.castBv; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.RemExpr; - -public final class BvURemExpr extends RemExpr { - - private static final int HASH_SEED = 995; - - private static final String OPERATOR_LABEL = "bvurem"; - - private BvURemExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - checkAllTypesEqual(leftOp, rightOp); - } - - public static BvURemExpr of(final Expr leftOp, final Expr rightOp) { - return new BvURemExpr(leftOp, rightOp); - } - - public static BvURemExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = castBv(leftOp); - final Expr newRightOp = castBv(rightOp); - return BvURemExpr.of(newLeftOp, newRightOp); - } - - @Override - public BvType getType() { - return getOps().get(0).getType(); - } - - @Override - public BvLitExpr eval(final Valuation val) { - final BvLitExpr leftOpVal = (BvLitExpr) getLeftOp().eval(val); - final BvLitExpr rightOpVal = (BvLitExpr) getRightOp().eval(val); - return leftOpVal.urem(rightOpVal); - } - - @Override - public BvURemExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return BvURemExpr.of(leftOp, rightOp); - } - } - - @Override - public BvURemExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } - - @Override - public BvURemExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final BvURemExpr that = (BvURemExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } +package hu.bme.mit.theta.core.type.bvtype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.RemExpr +import hu.bme.mit.theta.core.utils.TypeUtils +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("BvURem") +data class BvURemExpr( + override val leftOp: Expr, + override val rightOp: Expr +) : RemExpr() { + companion object { + private const val OPERATOR_LABEL = "bvurem" + + @JvmStatic + fun of(leftOp: Expr, rightOp: Expr) = BvURemExpr(leftOp, rightOp) + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = BvURemExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) + } + override val type: BvType get() = leftOp.type + override fun eval(`val`: Valuation): BvLitExpr { + val leftOpVal = leftOp.eval(`val`) as BvLitExpr + val rightOpVal = rightOp.eval(`val`) as BvLitExpr + return leftOpVal.urem(rightOpVal) + } + override fun of(leftOp: Expr, rightOp: Expr): BvURemExpr = Companion.of(leftOp, rightOp) + override val operatorLabel: String get() = OPERATOR_LABEL + override fun toString(): String = super.toString() } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvXorExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvXorExpr.kt index a74dbc31d3..6ad2e7a460 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvXorExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvXorExpr.kt @@ -13,80 +13,41 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.bvtype; -import static com.google.common.base.Preconditions.checkNotNull; -import static com.google.common.collect.ImmutableList.toImmutableList; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; +package hu.bme.mit.theta.core.type.bvtype -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.MultiaryExpr; -import hu.bme.mit.theta.core.utils.TypeUtils; -import java.util.List; +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.MultiaryExpr +import hu.bme.mit.theta.core.utils.TypeUtils +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -public final class BvXorExpr extends MultiaryExpr { +@Serializable +@SerialName("BvXor") +data class BvXorExpr( + override val ops: List> +) : MultiaryExpr() { - private static final int HASH_SEED = 9457; - private static final String OPERATOR_LABEL = "bvxor"; + companion object { + private const val OPERATOR_LABEL = "bvxor" - private BvXorExpr(final Iterable> ops) { - super(ops); - checkAllTypesEqual(ops); - } + @JvmStatic + fun of(ops: Iterable>) = BvXorExpr(ops.toList()) - public static BvXorExpr of(final Iterable> ops) { - return new BvXorExpr(ops); + @JvmStatic + fun create(ops: List>) = BvXorExpr(ops.map { TypeUtils.castBv(it) }) } - public static BvXorExpr create(final List> ops) { - checkNotNull(ops); - return BvXorExpr.of(ops.stream().map(TypeUtils::castBv).collect(toImmutableList())); - } + override val type: BvType get() = ops[0].type - @Override - public BvType getType() { - return getOps().get(0).getType(); + override fun eval(`val`: Valuation): BvLitExpr = ops.drop(1).fold(ops[0].eval(`val`) as BvLitExpr) { acc, op -> + acc.xor(op.eval(`val`) as BvLitExpr) } - @Override - public BvLitExpr eval(final Valuation val) { - return getOps().stream() - .skip(1) - .reduce( - (BvLitExpr) getOps().get(0).eval(val), - (op1, op2) -> (op1.xor((BvLitExpr) op2.eval(val))), - BvLitExpr::xor); - } + override fun of(ops: List>): BvXorExpr = Companion.of(ops) - @Override - public BvXorExpr with(final Iterable> ops) { - if (ops == getOps()) { - return this; - } else { - return BvXorExpr.of(ops); - } - } + override val operatorLabel: String get() = OPERATOR_LABEL - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final BvXorExpr that = (BvXorExpr) obj; - return this.getOps().equals(that.getOps()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } + override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvZExtExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvZExtExpr.kt index caf191202d..e5e6898342 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvZExtExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvZExtExpr.kt @@ -13,113 +13,51 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.bvtype; -import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.base.Preconditions.checkNotNull; -import static hu.bme.mit.theta.core.utils.TypeUtils.castBv; +package hu.bme.mit.theta.core.type.bvtype -import com.google.common.collect.ImmutableList; -import hu.bme.mit.theta.common.Utils; -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.LitExpr; -import java.util.List; +import hu.bme.mit.theta.common.Utils +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.utils.TypeUtils +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -public final class BvZExtExpr implements Expr { +@Serializable +@SerialName("BvZExt") +data class BvZExtExpr( + val op: Expr, + val extendType: BvType +) : Expr { - private static final int HASH_SEED = 6526; - private static final String OPERATOR_LABEL = "bv_zero_extend"; + companion object { - private final Expr op; - private final BvType extendType; + private const val OPERATOR_LABEL = "bv_zero_extend" - private volatile int hashCode = 0; + @JvmStatic + fun of(op: Expr, extendType: BvType) = BvZExtExpr(op, extendType) - private BvZExtExpr(final Expr op, final BvType extendType) { - checkNotNull(op); - checkNotNull(extendType); - checkArgument(extendType.getSize() >= op.getType().getSize()); - - this.op = op; - this.extendType = extendType; - } - - public static BvZExtExpr of(final Expr op, final BvType extendType) { - return new BvZExtExpr(op, extendType); - } - - public static BvZExtExpr create(final Expr op, final BvType extendType) { - return new BvZExtExpr(castBv(op), extendType); - } - - public Expr getOp() { - return op; - } - - public BvType getExtendType() { - return extendType; - } - - @Override - public int getArity() { - return 1; - } - - @Override - public BvType getType() { - return extendType; - } - - @Override - public LitExpr eval(Valuation val) { - final BvLitExpr bvLitExpr = (BvLitExpr) op.eval(val); - return bvLitExpr.zext(extendType); + @JvmStatic + fun create(op: Expr<*>, extendType: BvType) = BvZExtExpr(TypeUtils.castBv(op), extendType) } - @Override - public List> getOps() { - return ImmutableList.of(op); + override val arity: Int = 1 + override val type: BvType = extendType + override val ops: List> = listOf(op) + override fun eval(`val`: Valuation): LitExpr { + val bvLitExpr = op.eval(`val`) as BvLitExpr + return bvLitExpr.zext(extendType) } - @Override - public Expr withOps(List> ops) { - checkNotNull(ops); - checkArgument(ops.size() == 1); - final Expr newBitvec = castBv(ops.get(0)); - return of(newBitvec, extendType); + override fun withOps(ops: List>): Expr { + require(ops.size == 1) + return of(TypeUtils.castBv(ops[0]), extendType) } - @Override - public int hashCode() { - int result = hashCode; - if (result == 0) { - result = HASH_SEED; - result = 31 * result + op.hashCode(); - result = 31 * result + extendType.hashCode(); - hashCode = result; - } - return result; - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final BvZExtExpr that = (BvZExtExpr) obj; - return this.getOps().equals(that.getOps()) && this.getType().equals(that.getType()); - } else { - return false; - } - } - - @Override - public String toString() { - return Utils.lispStringBuilder(OPERATOR_LABEL) - .body() - .add(getOp()) - .add(getType()) - .toString(); - } + override fun toString(): String = Utils.lispStringBuilder(OPERATOR_LABEL) + .body() + .add(op) + .add(type) + .toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatDivExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatDivExpr.kt index e2449829a6..cbd8e14732 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatDivExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatDivExpr.kt @@ -34,7 +34,7 @@ data class RatDivExpr( ) : DivExpr() { companion object { - internal const val OPERATOR_LABEL = "/" + private const val OPERATOR_LABEL = "/" @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = RatDivExpr(leftOp, rightOp) @JvmStatic diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatMulExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatMulExpr.kt index 4234d53888..cae460dded 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatMulExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatMulExpr.kt @@ -33,7 +33,7 @@ data class RatMulExpr( companion object { - internal const val OPERATOR_LABEL = "*" + private const val OPERATOR_LABEL = "*" @JvmStatic fun of(ops: Iterable>) = RatMulExpr(ops.toList()) diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatNegExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatNegExpr.kt index 545d7c14db..de12e85daa 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatNegExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatNegExpr.kt @@ -31,7 +31,7 @@ data class RatNegExpr( ) : NegExpr() { companion object { - internal const val OPERATOR_LABEL = "-" + private const val OPERATOR_LABEL = "-" @JvmStatic fun of(op: Expr) = RatNegExpr(op) @JvmStatic diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatPosExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatPosExpr.kt index 767f7d3d4b..d2954ee427 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatPosExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatPosExpr.kt @@ -31,7 +31,7 @@ data class RatPosExpr( ) : PosExpr() { companion object { - internal const val OPERATOR_LABEL = "+" + private const val OPERATOR_LABEL = "+" @JvmStatic fun of(op: Expr) = RatPosExpr(op) @JvmStatic diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatSubExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatSubExpr.kt index 79ac6074c5..7f6898794b 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatSubExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatSubExpr.kt @@ -32,7 +32,7 @@ data class RatSubExpr( ) : SubExpr() { companion object { - internal const val OPERATOR_LABEL = "-" + private const val OPERATOR_LABEL = "-" @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = RatSubExpr(leftOp, rightOp) @JvmStatic diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatToIntExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatToIntExpr.kt index ce513d756d..3b8957e483 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatToIntExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatToIntExpr.kt @@ -35,7 +35,7 @@ data class RatToIntExpr( companion object { - internal const val OPERATOR_LABEL = "to_int" + private const val OPERATOR_LABEL = "to_int" @JvmStatic fun of(op: Expr) = RatToIntExpr(op) From d681ff0da1af325ddaadb7d43d9321d865d029f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Csan=C3=A1d=20Telbisz?= Date: Tue, 24 Jun 2025 11:37:58 +0200 Subject: [PATCH 21/48] convert to serializable - missing toString methods --- .../main/java/hu/bme/mit/theta/core/type/inttype/IntAddExpr.kt | 1 + .../main/java/hu/bme/mit/theta/core/type/inttype/IntDivExpr.kt | 1 + .../main/java/hu/bme/mit/theta/core/type/inttype/IntModExpr.kt | 2 ++ .../main/java/hu/bme/mit/theta/core/type/inttype/IntMulExpr.kt | 1 + .../main/java/hu/bme/mit/theta/core/type/inttype/IntNegExpr.kt | 1 + .../main/java/hu/bme/mit/theta/core/type/inttype/IntPosExpr.kt | 1 + .../main/java/hu/bme/mit/theta/core/type/inttype/IntRemExpr.kt | 1 + .../main/java/hu/bme/mit/theta/core/type/inttype/IntSubExpr.kt | 1 + .../java/hu/bme/mit/theta/core/type/inttype/IntToRatExpr.kt | 1 + .../main/java/hu/bme/mit/theta/core/type/rattype/RatAddExpr.kt | 2 ++ .../main/java/hu/bme/mit/theta/core/type/rattype/RatDivExpr.kt | 2 ++ .../main/java/hu/bme/mit/theta/core/type/rattype/RatMulExpr.kt | 1 + .../main/java/hu/bme/mit/theta/core/type/rattype/RatNegExpr.kt | 1 + .../main/java/hu/bme/mit/theta/core/type/rattype/RatPosExpr.kt | 1 + .../main/java/hu/bme/mit/theta/core/type/rattype/RatSubExpr.kt | 2 ++ 15 files changed, 19 insertions(+) diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntAddExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntAddExpr.kt index f477f56c7e..75ab0b2c38 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntAddExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntAddExpr.kt @@ -56,5 +56,6 @@ data class IntAddExpr( Companion.of(ops) override val operatorLabel: String get() = OPERATOR_LABEL + override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntDivExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntDivExpr.kt index 87b464c009..99b2189373 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntDivExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntDivExpr.kt @@ -51,5 +51,6 @@ data class IntDivExpr( Companion.of(leftOp, rightOp) override val operatorLabel: String get() = OPERATOR_LABEL + override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntModExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntModExpr.kt index 5f99a5fc3c..daa886f5fd 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntModExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntModExpr.kt @@ -51,5 +51,7 @@ data class IntModExpr( Companion.of(leftOp, rightOp) override val operatorLabel: String get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntMulExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntMulExpr.kt index c60cc206b2..e030ac42c0 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntMulExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntMulExpr.kt @@ -54,5 +54,6 @@ data class IntMulExpr( Companion.of(ops) override val operatorLabel: String get() = OPERATOR_LABEL + override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntNegExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntNegExpr.kt index 9d6c825fd0..3bf1829072 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntNegExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntNegExpr.kt @@ -47,5 +47,6 @@ data class IntNegExpr( override fun of(op: Expr): IntNegExpr = Companion.of(op) override val operatorLabel: String get() = OPERATOR_LABEL + override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntPosExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntPosExpr.kt index 1fb314f9a7..239f382355 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntPosExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntPosExpr.kt @@ -47,5 +47,6 @@ data class IntPosExpr( override fun of(op: Expr): IntPosExpr = Companion.of(op) override val operatorLabel: String get() = OPERATOR_LABEL + override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntRemExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntRemExpr.kt index da11de40e9..7a5e60d751 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntRemExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntRemExpr.kt @@ -51,5 +51,6 @@ data class IntRemExpr( Companion.of(leftOp, rightOp) override val operatorLabel: String get() = OPERATOR_LABEL + override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntSubExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntSubExpr.kt index 08745ed4ff..9c4fac33b0 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntSubExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntSubExpr.kt @@ -51,5 +51,6 @@ data class IntSubExpr( Companion.of(leftOp, rightOp) override val operatorLabel: String get() = OPERATOR_LABEL + override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntToRatExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntToRatExpr.kt index c97d4a2737..7a9d8334b1 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntToRatExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntToRatExpr.kt @@ -52,5 +52,6 @@ data class IntToRatExpr( override fun of(op: Expr): IntToRatExpr = Companion.of(op) override val operatorLabel: String get() = OPERATOR_LABEL + override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatAddExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatAddExpr.kt index 450a5b5325..5114ab1ab4 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatAddExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatAddExpr.kt @@ -63,5 +63,7 @@ class RatAddExpr( override fun of(ops: List>): RatAddExpr = of(ops) override val operatorLabel: String = OPERATOR_LABEL + + override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatDivExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatDivExpr.kt index cbd8e14732..84687e5bb4 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatDivExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatDivExpr.kt @@ -64,5 +64,7 @@ data class RatDivExpr( Companion.of(leftOp, rightOp) override val operatorLabel: String get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatMulExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatMulExpr.kt index cae460dded..cda295762b 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatMulExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatMulExpr.kt @@ -58,5 +58,6 @@ data class RatMulExpr( Companion.of(ops) override val operatorLabel: String get() = OPERATOR_LABEL + override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatNegExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatNegExpr.kt index de12e85daa..3f881135af 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatNegExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatNegExpr.kt @@ -46,5 +46,6 @@ data class RatNegExpr( override fun of(op: Expr): RatNegExpr = Companion.of(op) override val operatorLabel: String get() = OPERATOR_LABEL + override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatPosExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatPosExpr.kt index d2954ee427..3d2210b9f4 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatPosExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatPosExpr.kt @@ -46,5 +46,6 @@ data class RatPosExpr( override fun of(op: Expr): RatPosExpr = Companion.of(op) override val operatorLabel: String get() = OPERATOR_LABEL + override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatSubExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatSubExpr.kt index 7f6898794b..42ec11751a 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatSubExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatSubExpr.kt @@ -50,5 +50,7 @@ data class RatSubExpr( Companion.of(leftOp, rightOp) override val operatorLabel: String get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() } From 5fe62ed38a7b1138fafdc91a86440dea3b00c82f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Csan=C3=A1d=20Telbisz?= Date: Tue, 24 Jun 2025 12:54:58 +0200 Subject: [PATCH 22/48] Rename .java to .kt --- .../mit/theta/core/type/fptype/{FpAbsExpr.java => FpAbsExpr.kt} | 0 .../mit/theta/core/type/fptype/{FpAddExpr.java => FpAddExpr.kt} | 0 .../theta/core/type/fptype/{FpAssignExpr.java => FpAssignExpr.kt} | 0 .../mit/theta/core/type/fptype/{FpDivExpr.java => FpDivExpr.kt} | 0 .../bme/mit/theta/core/type/fptype/{FpEqExpr.java => FpEqExpr.kt} | 0 .../bme/mit/theta/core/type/fptype/{FpExprs.java => FpExprs.kt} | 0 .../theta/core/type/fptype/{FpFromBvExpr.java => FpFromBvExpr.kt} | 0 .../mit/theta/core/type/fptype/{FpGeqExpr.java => FpGeqExpr.kt} | 0 .../bme/mit/theta/core/type/fptype/{FpGtExpr.java => FpGtExpr.kt} | 0 .../type/fptype/{FpIsInfiniteExpr.java => FpIsInfiniteExpr.kt} | 0 .../theta/core/type/fptype/{FpIsNanExpr.java => FpIsNanExpr.kt} | 0 .../mit/theta/core/type/fptype/{FpLeqExpr.java => FpLeqExpr.kt} | 0 .../mit/theta/core/type/fptype/{FpLitExpr.java => FpLitExpr.kt} | 0 .../bme/mit/theta/core/type/fptype/{FpLtExpr.java => FpLtExpr.kt} | 0 .../mit/theta/core/type/fptype/{FpMaxExpr.java => FpMaxExpr.kt} | 0 .../mit/theta/core/type/fptype/{FpMinExpr.java => FpMinExpr.kt} | 0 .../mit/theta/core/type/fptype/{FpMulExpr.java => FpMulExpr.kt} | 0 .../mit/theta/core/type/fptype/{FpNegExpr.java => FpNegExpr.kt} | 0 .../mit/theta/core/type/fptype/{FpNeqExpr.java => FpNeqExpr.kt} | 0 .../mit/theta/core/type/fptype/{FpPosExpr.java => FpPosExpr.kt} | 0 .../mit/theta/core/type/fptype/{FpRemExpr.java => FpRemExpr.kt} | 0 .../{FpRoundToIntegralExpr.java => FpRoundToIntegralExpr.kt} | 0 .../core/type/fptype/{FpRoundingMode.java => FpRoundingMode.kt} | 0 .../mit/theta/core/type/fptype/{FpSqrtExpr.java => FpSqrtExpr.kt} | 0 .../mit/theta/core/type/fptype/{FpSubExpr.java => FpSubExpr.kt} | 0 .../mit/theta/core/type/fptype/{FpToBvExpr.java => FpToBvExpr.kt} | 0 .../mit/theta/core/type/fptype/{FpToFpExpr.java => FpToFpExpr.kt} | 0 .../hu/bme/mit/theta/core/type/fptype/{FpType.java => FpType.kt} | 0 28 files changed, 0 insertions(+), 0 deletions(-) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/{FpAbsExpr.java => FpAbsExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/{FpAddExpr.java => FpAddExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/{FpAssignExpr.java => FpAssignExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/{FpDivExpr.java => FpDivExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/{FpEqExpr.java => FpEqExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/{FpExprs.java => FpExprs.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/{FpFromBvExpr.java => FpFromBvExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/{FpGeqExpr.java => FpGeqExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/{FpGtExpr.java => FpGtExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/{FpIsInfiniteExpr.java => FpIsInfiniteExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/{FpIsNanExpr.java => FpIsNanExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/{FpLeqExpr.java => FpLeqExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/{FpLitExpr.java => FpLitExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/{FpLtExpr.java => FpLtExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/{FpMaxExpr.java => FpMaxExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/{FpMinExpr.java => FpMinExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/{FpMulExpr.java => FpMulExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/{FpNegExpr.java => FpNegExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/{FpNeqExpr.java => FpNeqExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/{FpPosExpr.java => FpPosExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/{FpRemExpr.java => FpRemExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/{FpRoundToIntegralExpr.java => FpRoundToIntegralExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/{FpRoundingMode.java => FpRoundingMode.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/{FpSqrtExpr.java => FpSqrtExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/{FpSubExpr.java => FpSubExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/{FpToBvExpr.java => FpToBvExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/{FpToFpExpr.java => FpToFpExpr.kt} (100%) rename subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/{FpType.java => FpType.kt} (100%) diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpAbsExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpAbsExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpAbsExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpAbsExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpAddExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpAddExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpAddExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpAddExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpAssignExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpAssignExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpAssignExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpAssignExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpDivExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpDivExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpDivExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpDivExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpEqExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpEqExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpEqExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpEqExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpExprs.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpExprs.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpExprs.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpExprs.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpFromBvExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpFromBvExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpFromBvExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpFromBvExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpGeqExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpGeqExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpGeqExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpGeqExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpGtExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpGtExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpGtExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpGtExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpIsInfiniteExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpIsInfiniteExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpIsInfiniteExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpIsInfiniteExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpIsNanExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpIsNanExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpIsNanExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpIsNanExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpLeqExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpLeqExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpLeqExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpLeqExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpLitExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpLitExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpLitExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpLitExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpLtExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpLtExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpLtExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpLtExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpMaxExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpMaxExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpMaxExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpMaxExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpMinExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpMinExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpMinExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpMinExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpMulExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpMulExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpMulExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpMulExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpNegExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpNegExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpNegExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpNegExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpNeqExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpNeqExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpNeqExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpNeqExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpPosExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpPosExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpPosExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpPosExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpRemExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpRemExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpRemExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpRemExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpRoundToIntegralExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpRoundToIntegralExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpRoundToIntegralExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpRoundToIntegralExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpRoundingMode.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpRoundingMode.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpRoundingMode.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpRoundingMode.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpSqrtExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpSqrtExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpSqrtExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpSqrtExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpSubExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpSubExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpSubExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpSubExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpToBvExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpToBvExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpToBvExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpToBvExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpToFpExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpToFpExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpToFpExpr.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpToFpExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpType.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpType.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpType.java rename to subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpType.kt From cb5bc029fc60b152e76b84df81db43030b8e564d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Csan=C3=A1d=20Telbisz?= Date: Tue, 24 Jun 2025 12:55:00 +0200 Subject: [PATCH 23/48] convert to serializable - fptype --- .../mit/theta/core/type/fptype/FpAbsExpr.kt | 86 ++-- .../mit/theta/core/type/fptype/FpAddExpr.kt | 105 ++--- .../theta/core/type/fptype/FpAssignExpr.kt | 105 ++--- .../mit/theta/core/type/fptype/FpDivExpr.kt | 121 ++--- .../mit/theta/core/type/fptype/FpEqExpr.kt | 106 ++--- .../bme/mit/theta/core/type/fptype/FpExprs.kt | 230 ++++----- .../theta/core/type/fptype/FpFromBvExpr.kt | 164 +++---- .../mit/theta/core/type/fptype/FpGeqExpr.kt | 106 ++--- .../mit/theta/core/type/fptype/FpGtExpr.kt | 107 ++--- .../core/type/fptype/FpIsInfiniteExpr.kt | 95 ++-- .../mit/theta/core/type/fptype/FpIsNanExpr.kt | 88 ++-- .../mit/theta/core/type/fptype/FpLeqExpr.kt | 107 ++--- .../mit/theta/core/type/fptype/FpLitExpr.kt | 435 ++++++++---------- .../mit/theta/core/type/fptype/FpLtExpr.kt | 105 ++--- .../mit/theta/core/type/fptype/FpMaxExpr.kt | 117 ++--- .../mit/theta/core/type/fptype/FpMinExpr.kt | 117 ++--- .../mit/theta/core/type/fptype/FpMulExpr.kt | 104 ++--- .../mit/theta/core/type/fptype/FpNegExpr.kt | 79 +--- .../mit/theta/core/type/fptype/FpNeqExpr.kt | 105 ++--- .../mit/theta/core/type/fptype/FpPosExpr.kt | 81 +--- .../mit/theta/core/type/fptype/FpRemExpr.kt | 118 ++--- .../core/type/fptype/FpRoundToIntegralExpr.kt | 122 ++--- .../theta/core/type/fptype/FpRoundingMode.kt | 28 +- .../mit/theta/core/type/fptype/FpSqrtExpr.kt | 102 ++-- .../mit/theta/core/type/fptype/FpSubExpr.kt | 123 ++--- .../mit/theta/core/type/fptype/FpToBvExpr.kt | 173 +++---- .../mit/theta/core/type/fptype/FpToFpExpr.kt | 141 ++---- .../bme/mit/theta/core/type/fptype/FpType.kt | 162 ++----- .../mit/theta/grammar/dsl/expr/ExprParser.kt | 2 +- 29 files changed, 1196 insertions(+), 2338 deletions(-) diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpAbsExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpAbsExpr.kt index ca5e0567a8..fec011f39f 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpAbsExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpAbsExpr.kt @@ -13,76 +13,46 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.fptype; -import static com.google.common.base.Preconditions.checkNotNull; -import static hu.bme.mit.theta.core.utils.TypeUtils.castFp; +package hu.bme.mit.theta.core.type.fptype -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.UnaryExpr; +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.UnaryExpr +import hu.bme.mit.theta.core.utils.TypeUtils.castFp +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -public class FpAbsExpr extends UnaryExpr { +@Serializable +@SerialName("FpAbs") +data class FpAbsExpr( + override val op: Expr +) : UnaryExpr() { + companion object { + private const val OPERATOR_LABEL = "fpabs" - private static final int HASH_SEED = 6666; - private static final String OPERATOR_LABEL = "fpabs"; + @JvmStatic + fun of(op: Expr) = FpAbsExpr(op) - private FpAbsExpr(final Expr op) { - super(op); + @JvmStatic + fun create(op: Expr<*>) = FpAbsExpr(castFp(op)) } - public static FpAbsExpr of(final Expr op) { - return new FpAbsExpr(castFp(op)); - } - - public static FpAbsExpr create(final Expr op) { - checkNotNull(op); - return FpAbsExpr.of(castFp(op)); - } - - @Override - public FpType getType() { - return getOp().getType(); - } + override val type: FpType get() = op.type - @Override - public FpLitExpr eval(Valuation val) { - final FpLitExpr opVal = (FpLitExpr) getOp().eval(val); - if (opVal.getHidden()) { - return opVal.neg(); + override fun eval(`val`: Valuation): FpLitExpr { + val opVal = op.eval(`val`) as FpLitExpr + return if (opVal.hidden) { + opVal.neg() } else { - return opVal; + opVal } } - @Override - public FpAbsExpr with(final Expr op) { - if (op == getOp()) { - return this; - } else { - return FpAbsExpr.of(op); - } - } + override fun of(op: Expr): FpAbsExpr = Companion.of(op) - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final FpAbsExpr that = (FpAbsExpr) obj; - return this.getOp().equals(that.getOp()); - } else { - return false; - } - } + override val operatorLabel: String get() = OPERATOR_LABEL - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } + override fun toString(): String = super.toString() } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpAddExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpAddExpr.kt index 7793314b71..0cac79283a 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpAddExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpAddExpr.kt @@ -13,92 +13,51 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.fptype; -import static com.google.common.base.Preconditions.checkNotNull; -import static com.google.common.collect.ImmutableList.toImmutableList; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; +package hu.bme.mit.theta.core.type.fptype -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.AddExpr; -import hu.bme.mit.theta.core.utils.TypeUtils; -import java.util.List; +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.AddExpr +import hu.bme.mit.theta.core.utils.TypeUtils.castFp +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -public class FpAddExpr extends AddExpr { +@Serializable +@SerialName("FpAdd") +data class FpAddExpr( + val roundingMode: FpRoundingMode, + override val ops: List> +) : AddExpr() { - private static final int HASH_SEED = 6588; - private static final String OPERATOR_LABEL = "fpadd"; - - private final FpRoundingMode roundingMode; - - private FpAddExpr( - final FpRoundingMode roundingMode, final Iterable> ops) { - super(ops); - checkAllTypesEqual(ops); - checkNotNull(roundingMode); - this.roundingMode = roundingMode; + init { + checkAllTypesEqual(ops) } - public static FpAddExpr of( - final FpRoundingMode roundingMode, final Iterable> ops) { - return new FpAddExpr(roundingMode, ops); - } + companion object { + private const val OPERATOR_LABEL = "fpadd" - public static FpAddExpr create( - final FpRoundingMode roundingMode, final List> ops) { - checkNotNull(ops); - return FpAddExpr.of( - roundingMode, ops.stream().map(TypeUtils::castFp).collect(toImmutableList())); - } + @JvmStatic + fun of(roundingMode: FpRoundingMode, ops: Iterable>) = + FpAddExpr(roundingMode, ops.toList()) - public FpRoundingMode getRoundingMode() { - return roundingMode; + @JvmStatic + fun create(roundingMode: FpRoundingMode, ops: List>) = + FpAddExpr(roundingMode, ops.map { castFp(it) }) } - @Override - public FpType getType() { - return getOps().get(0).getType(); - } - - @Override - public FpLitExpr eval(final Valuation val) { - return getOps().stream() - .skip(1) - .reduce( - (FpLitExpr) getOps().get(0).eval(val), - (op1, op2) -> (op1.add(roundingMode, (FpLitExpr) op2.eval(val))), - (op1, op2) -> (op1.add(roundingMode, op2))); - } + override val type: FpType get() = ops[0].type - @Override - public FpAddExpr with(final Iterable> ops) { - if (ops == getOps()) { - return this; - } else { - return FpAddExpr.of(roundingMode, ops); + override fun eval(`val`: Valuation): FpLitExpr = + ops.drop(1).fold(ops[0].eval(`val`) as FpLitExpr) { acc, op -> + acc.add(roundingMode, op.eval(`val`) as FpLitExpr) } - } - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final FpAddExpr that = (FpAddExpr) obj; - return this.getOps().equals(that.getOps()) && roundingMode == that.roundingMode; - } else { - return false; - } - } + override fun of(ops: List>): FpAddExpr = Companion.of(roundingMode, ops) - @Override - protected int getHashSeed() { - return HASH_SEED; - } + override val operatorLabel: String get() = OPERATOR_LABEL - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } + override fun toString(): String = super.toString() } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpAssignExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpAssignExpr.kt index d5cb83f45f..f1736ee16c 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpAssignExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpAssignExpr.kt @@ -13,90 +13,49 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.fptype; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.utils.TypeUtils.castFp; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; +package hu.bme.mit.theta.core.type.fptype -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.EqExpr; -import hu.bme.mit.theta.core.type.booltype.BoolLitExpr; -import hu.bme.mit.theta.core.type.booltype.BoolType; +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.EqExpr +import hu.bme.mit.theta.core.type.booltype.BoolLitExpr +import hu.bme.mit.theta.core.utils.TypeUtils.castFp +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -public final class FpAssignExpr extends EqExpr { +@Serializable +@SerialName("FpAssign") +data class FpAssignExpr( + override val leftOp: Expr, + override val rightOp: Expr +) : EqExpr() { - private static final int HASH_SEED = 1747; - private static final String OPERATOR_LABEL = "="; - - private FpAssignExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - checkAllTypesEqual(leftOp, rightOp); - } - - public static FpAssignExpr of(final Expr leftOp, final Expr rightOp) { - return new FpAssignExpr(leftOp, rightOp); - } - - public static FpAssignExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = castFp(leftOp); - final Expr newRightOp = castFp(rightOp); - return FpAssignExpr.of(newLeftOp, newRightOp); + init { + checkAllTypesEqual(leftOp, rightOp) } - @Override - public BoolType getType() { - return Bool(); - } + companion object { - @Override - public BoolLitExpr eval(final Valuation val) { - final FpLitExpr leftOpVal = (FpLitExpr) getLeftOp().eval(val); - final FpLitExpr rightOpVal = (FpLitExpr) getRightOp().eval(val); + @JvmStatic + fun of(leftOp: Expr, rightOp: Expr) = + FpAssignExpr(leftOp, rightOp) - return leftOpVal.assign(rightOpVal); + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + FpAssignExpr(castFp(leftOp), castFp(rightOp)) } - @Override - public FpAssignExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return FpAssignExpr.of(leftOp, rightOp); - } + override fun eval(`val`: Valuation): BoolLitExpr { + val leftOpVal = leftOp.eval(`val`) as FpLitExpr + val rightOpVal = rightOp.eval(`val`) as FpLitExpr + return leftOpVal.assign(rightOpVal) } - @Override - public FpAssignExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } + override fun of(leftOp: Expr, rightOp: Expr): FpAssignExpr = + Companion.of(leftOp, rightOp) - @Override - public FpAssignExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final FpAssignExpr that = (FpAssignExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } + override fun toString(): String = super.toString() } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpDivExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpDivExpr.kt index c3f9f23a97..96562ad35d 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpDivExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpDivExpr.kt @@ -13,101 +13,52 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.fptype; -import static hu.bme.mit.theta.core.utils.TypeUtils.castFp; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.DivExpr; - -public final class FpDivExpr extends DivExpr { - private static final int HASH_SEED = 1646; - private static final String OPERATOR = "fpdiv"; - - private final FpRoundingMode roundingMode; - - private FpDivExpr( - final FpRoundingMode roundingMode, - final Expr leftOp, - final Expr rightOp) { - super(leftOp, rightOp); - checkAllTypesEqual(leftOp, rightOp); - this.roundingMode = roundingMode; +package hu.bme.mit.theta.core.type.fptype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.DivExpr +import hu.bme.mit.theta.core.utils.TypeUtils.castFp +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("FpDiv") +data class FpDivExpr( + val roundingMode: FpRoundingMode, + override val leftOp: Expr, + override val rightOp: Expr +) : DivExpr() { + init { + checkAllTypesEqual(leftOp, rightOp) } - public static FpDivExpr of( - final FpRoundingMode roundingMode, - final Expr leftOp, - final Expr rightOp) { - return new FpDivExpr(roundingMode, leftOp, rightOp); - } + companion object { + private const val OPERATOR_LABEL = "fpdiv" - public static FpDivExpr create( - final FpRoundingMode roundingMode, final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = castFp(leftOp); - final Expr newRightOp = castFp(rightOp); - return FpDivExpr.of(roundingMode, newLeftOp, newRightOp); - } - - public FpRoundingMode getRoundingMode() { - return roundingMode; - } + @JvmStatic + fun of(roundingMode: FpRoundingMode, leftOp: Expr, rightOp: Expr) = + FpDivExpr(roundingMode, leftOp, rightOp) - @Override - public FpType getType() { - return getOps().get(0).getType(); + @JvmStatic + fun create(roundingMode: FpRoundingMode, leftOp: Expr<*>, rightOp: Expr<*>) = + FpDivExpr(roundingMode, castFp(leftOp), castFp(rightOp)) } - @Override - public FpLitExpr eval(final Valuation val) { - final FpLitExpr leftOpVal = (FpLitExpr) getLeftOp().eval(val); - final FpLitExpr rightOpVal = (FpLitExpr) getRightOp().eval(val); + override val type: FpType get() = leftOp.type - return leftOpVal.div(roundingMode, rightOpVal); + override fun eval(`val`: Valuation): FpLitExpr { + val leftOpVal = leftOp.eval(`val`) as FpLitExpr + val rightOpVal = rightOp.eval(`val`) as FpLitExpr + return leftOpVal.div(roundingMode, rightOpVal) } - @Override - public FpDivExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return FpDivExpr.of(roundingMode, leftOp, rightOp); - } - } + override fun of(leftOp: Expr, rightOp: Expr): FpDivExpr = + Companion.of(roundingMode, leftOp, rightOp) - @Override - public FpDivExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } - - @Override - public FpDivExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final FpDivExpr that = (FpDivExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()) - && roundingMode == that.roundingMode; - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } + override val operatorLabel: String get() = OPERATOR_LABEL - @Override - public String getOperatorLabel() { - return OPERATOR + "[" + roundingMode.name().toLowerCase() + "]"; - } + override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpEqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpEqExpr.kt index 217b01d16e..ba3470a771 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpEqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpEqExpr.kt @@ -13,90 +13,48 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.fptype; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.utils.TypeUtils.castFp; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; +package hu.bme.mit.theta.core.type.fptype -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.EqExpr; -import hu.bme.mit.theta.core.type.booltype.BoolLitExpr; -import hu.bme.mit.theta.core.type.booltype.BoolType; +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.EqExpr +import hu.bme.mit.theta.core.type.booltype.BoolLitExpr +import hu.bme.mit.theta.core.utils.TypeUtils.castFp +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -public final class FpEqExpr extends EqExpr { - - private static final int HASH_SEED = 1746; - private static final String OPERATOR_LABEL = "="; - - private FpEqExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - checkAllTypesEqual(leftOp, rightOp); - } - - public static FpEqExpr of(final Expr leftOp, final Expr rightOp) { - return new FpEqExpr(leftOp, rightOp); - } - - public static FpEqExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = castFp(leftOp); - final Expr newRightOp = castFp(rightOp); - return FpEqExpr.of(newLeftOp, newRightOp); - } - - @Override - public BoolType getType() { - return Bool(); +@Serializable +@SerialName("FpEq") +data class FpEqExpr( + override val leftOp: Expr, + override val rightOp: Expr +) : EqExpr() { + init { + checkAllTypesEqual(leftOp, rightOp) } - @Override - public BoolLitExpr eval(final Valuation val) { - final FpLitExpr leftOpVal = (FpLitExpr) getLeftOp().eval(val); - final FpLitExpr rightOpVal = (FpLitExpr) getRightOp().eval(val); + companion object { - return leftOpVal.eq(rightOpVal); - } - - @Override - public FpEqExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return FpEqExpr.of(leftOp, rightOp); - } - } - - @Override - public FpEqExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } + @JvmStatic + fun of(leftOp: Expr, rightOp: Expr) = + FpEqExpr(leftOp, rightOp) - @Override - public FpEqExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + FpEqExpr(castFp(leftOp), castFp(rightOp)) } - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final FpEqExpr that = (FpEqExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } + override fun eval(`val`: Valuation): BoolLitExpr { + val leftOpVal = leftOp.eval(`val`) as FpLitExpr + val rightOpVal = rightOp.eval(`val`) as FpLitExpr + return leftOpVal.eq(rightOpVal) } - @Override - protected int getHashSeed() { - return HASH_SEED; - } + override fun of(leftOp: Expr, rightOp: Expr): FpEqExpr = + Companion.of(leftOp, rightOp) - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } + override fun toString(): String = super.toString() } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpExprs.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpExprs.kt index 38c449bf53..269e3ca636 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpExprs.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpExprs.kt @@ -13,184 +13,132 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.fptype; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.bvtype.BvLitExpr; -import hu.bme.mit.theta.core.type.bvtype.BvType; -import java.util.Arrays; +package hu.bme.mit.theta.core.type.fptype -public final class FpExprs { +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.bvtype.BvLitExpr +import hu.bme.mit.theta.core.type.bvtype.BvType - private FpExprs() {} +@Suppress("FunctionName") +object FpExprs { - public static FpType FpType(final int exponent, final int significand) { - return FpType.of(exponent, significand); - } - - public static FpLitExpr Fp(boolean hidden, BvLitExpr exponent, BvLitExpr significand) { - return FpLitExpr.of(hidden, exponent, significand); - } + @JvmStatic + fun FpType(exponent: Int, significand: Int) = FpType.of(exponent, significand) - public static FpLitExpr NaN(final FpType fpType) { - final var exponent = new boolean[fpType.getExponent()]; - Arrays.fill(exponent, true); - final var significand = new boolean[fpType.getSignificand() - 1]; - Arrays.fill(significand, true); + @JvmStatic + fun Fp(hidden: Boolean, exponent: BvLitExpr, significand: BvLitExpr) = FpLitExpr(hidden, exponent, significand) - return Fp(false, BvLitExpr.of(exponent), BvLitExpr.of(significand)); + @JvmStatic + fun NaN(fpType: FpType): FpLitExpr { + val exponent = BooleanArray(fpType.exponent) { true } + val significand = BooleanArray(fpType.significand - 1) { true } + return Fp(false, BvLitExpr.of(exponent), BvLitExpr.of(significand)) } - public static FpLitExpr PositiveInfinity(final FpType fpType) { - final var exponent = new boolean[fpType.getExponent()]; - Arrays.fill(exponent, true); - final var significand = new boolean[fpType.getSignificand() - 1]; - Arrays.fill(significand, false); - - return Fp(false, BvLitExpr.of(exponent), BvLitExpr.of(significand)); + @JvmStatic + fun PositiveInfinity(fpType: FpType): FpLitExpr { + val exponent = BooleanArray(fpType.exponent) { true } + val significand = BooleanArray(fpType.significand - 1) { false } + return Fp(false, BvLitExpr.of(exponent), BvLitExpr.of(significand)) } - public static FpLitExpr NegativeInfinity(final FpType fpType) { - final var exponent = new boolean[fpType.getExponent()]; - Arrays.fill(exponent, true); - final var significand = new boolean[fpType.getSignificand() - 1]; - Arrays.fill(significand, false); - - return Fp(true, BvLitExpr.of(exponent), BvLitExpr.of(significand)); + @JvmStatic + fun NegativeInfinity(fpType: FpType): FpLitExpr { + val exponent = BooleanArray(fpType.exponent) { true } + val significand = BooleanArray(fpType.significand - 1) { false } + return Fp(true, BvLitExpr.of(exponent), BvLitExpr.of(significand)) } - public static FpLitExpr PositiveZero(final FpType fpType) { - final var exponent = new boolean[fpType.getExponent()]; - Arrays.fill(exponent, false); - final var significand = new boolean[fpType.getSignificand() - 1]; - Arrays.fill(significand, false); - - return Fp(false, BvLitExpr.of(exponent), BvLitExpr.of(significand)); + @JvmStatic + fun PositiveZero(fpType: FpType): FpLitExpr { + val exponent = BooleanArray(fpType.exponent) { false } + val significand = BooleanArray(fpType.significand - 1) { false } + return Fp(false, BvLitExpr.of(exponent), BvLitExpr.of(significand)) } - public static FpLitExpr NegativeZero(final FpType fpType) { - final var exponent = new boolean[fpType.getExponent()]; - Arrays.fill(exponent, false); - final var significand = new boolean[fpType.getSignificand() - 1]; - Arrays.fill(significand, false); - - return Fp(true, BvLitExpr.of(exponent), BvLitExpr.of(significand)); + @JvmStatic + fun NegativeZero(fpType: FpType): FpLitExpr { + val exponent = BooleanArray(fpType.exponent) { false } + val significand = BooleanArray(fpType.significand - 1) { false } + return Fp(true, BvLitExpr.of(exponent), BvLitExpr.of(significand)) } - public static FpAddExpr Add( - final FpRoundingMode roundingMode, final Iterable> ops) { - return FpAddExpr.of(roundingMode, ops); - } + @JvmStatic + fun Add(roundingMode: FpRoundingMode, ops: Iterable>) = FpAddExpr.of(roundingMode, ops) - public static FpSubExpr Sub( - final FpRoundingMode roundingMode, - final Expr leftOp, - final Expr rightOp) { - return FpSubExpr.of(roundingMode, leftOp, rightOp); - } + @JvmStatic + fun Sub(roundingMode: FpRoundingMode, leftOp: Expr, rightOp: Expr) = + FpSubExpr(roundingMode, leftOp, rightOp) - public static FpPosExpr Pos(final Expr op) { - return FpPosExpr.of(op); - } + @JvmStatic + fun Pos(op: Expr) = FpPosExpr(op) - public static FpNegExpr Neg(final Expr op) { - return FpNegExpr.of(op); - } + @JvmStatic + fun Neg(op: Expr) = FpNegExpr(op) - public static FpMulExpr Mul( - final FpRoundingMode roundingMode, final Iterable> ops) { - return FpMulExpr.of(roundingMode, ops); - } + @JvmStatic + fun Mul(roundingMode: FpRoundingMode, ops: Iterable>) = FpMulExpr.of(roundingMode, ops) - public static FpDivExpr Div( - final FpRoundingMode roundingMode, - final Expr leftOp, - final Expr rightOp) { - return FpDivExpr.of(roundingMode, leftOp, rightOp); - } + @JvmStatic + fun Div(roundingMode: FpRoundingMode, leftOp: Expr, rightOp: Expr) = + FpDivExpr(roundingMode, leftOp, rightOp) - public static FpRemExpr Rem(final Expr leftOp, final Expr rightOp) { - return FpRemExpr.of(leftOp, rightOp); - } + @JvmStatic + fun Rem(leftOp: Expr, rightOp: Expr) = FpRemExpr(leftOp, rightOp) - public static FpAbsExpr Abs(final Expr op) { - return FpAbsExpr.of(op); - } + @JvmStatic + fun Abs(op: Expr) = FpAbsExpr(op) - public static FpFromBvExpr FromBv( - final FpRoundingMode roundingMode, - final Expr op, - final FpType fpType, - final boolean signed) { - return FpFromBvExpr.of(roundingMode, op, fpType, signed); - } + @JvmStatic + fun FromBv(roundingMode: FpRoundingMode, op: Expr, fpType: FpType, signed: Boolean) = + FpFromBvExpr(roundingMode, op, fpType, signed) - public static FpEqExpr Eq(final Expr leftOp, final Expr rightOp) { - return FpEqExpr.of(leftOp, rightOp); - } + @JvmStatic + fun Eq(leftOp: Expr, rightOp: Expr) = FpEqExpr(leftOp, rightOp) - public static FpAssignExpr FpAssign(final Expr leftOp, final Expr rightOp) { - return FpAssignExpr.of(leftOp, rightOp); - } + @JvmStatic + fun FpAssign(leftOp: Expr, rightOp: Expr) = FpAssignExpr(leftOp, rightOp) - public static FpNeqExpr Neq(final Expr leftOp, final Expr rightOp) { - return FpNeqExpr.of(leftOp, rightOp); - } + @JvmStatic + fun Neq(leftOp: Expr, rightOp: Expr) = FpNeqExpr(leftOp, rightOp) - public static FpGtExpr Gt(final Expr leftOp, final Expr rightOp) { - return FpGtExpr.of(leftOp, rightOp); - } + @JvmStatic + fun Gt(leftOp: Expr, rightOp: Expr) = FpGtExpr(leftOp, rightOp) - public static FpGeqExpr Geq(final Expr leftOp, final Expr rightOp) { - return FpGeqExpr.of(leftOp, rightOp); - } + @JvmStatic + fun Geq(leftOp: Expr, rightOp: Expr) = FpGeqExpr(leftOp, rightOp) - public static FpLtExpr Lt(final Expr leftOp, final Expr rightOp) { - return FpLtExpr.of(leftOp, rightOp); - } + @JvmStatic + fun Lt(leftOp: Expr, rightOp: Expr) = FpLtExpr(leftOp, rightOp) - public static FpLeqExpr Leq(final Expr leftOp, final Expr rightOp) { - return FpLeqExpr.of(leftOp, rightOp); - } + @JvmStatic + fun Leq(leftOp: Expr, rightOp: Expr) = FpLeqExpr(leftOp, rightOp) - public static FpIsNanExpr IsNan(final Expr op) { - return FpIsNanExpr.of(op); - } + @JvmStatic + fun IsNan(op: Expr) = FpIsNanExpr(op) - public static FpIsInfiniteExpr IsInfinite(final Expr op) { - return FpIsInfiniteExpr.of(op); - } + @JvmStatic + fun IsInfinite(op: Expr) = FpIsInfiniteExpr(op) - public static FpRoundToIntegralExpr RoundToIntegral( - final FpRoundingMode roundingMode, final Expr op) { - return FpRoundToIntegralExpr.of(roundingMode, op); - } + @JvmStatic + fun RoundToIntegral(roundingMode: FpRoundingMode, op: Expr) = FpRoundToIntegralExpr(roundingMode, op) - public static FpSqrtExpr Sqrt(final FpRoundingMode roundingMode, final Expr op) { - return FpSqrtExpr.of(roundingMode, op); - } + @JvmStatic + fun Sqrt(roundingMode: FpRoundingMode, op: Expr) = FpSqrtExpr(roundingMode, op) - public static FpMaxExpr Max(final Expr leftOp, final Expr rightOp) { - return FpMaxExpr.of(leftOp, rightOp); - } + @JvmStatic + fun Max(leftOp: Expr, rightOp: Expr) = FpMaxExpr(leftOp, rightOp) - public static FpMinExpr Min(final Expr leftOp, final Expr rightOp) { - return FpMinExpr.of(leftOp, rightOp); - } + @JvmStatic + fun Min(leftOp: Expr, rightOp: Expr) = FpMinExpr(leftOp, rightOp) - public static FpToBvExpr ToBv( - final FpRoundingMode roundingMode, - final Expr op, - final int size, - final boolean sgn) { - return FpToBvExpr.of(roundingMode, op, size, sgn); - } + @JvmStatic + fun ToBv(roundingMode: FpRoundingMode, op: Expr, size: Int, sgn: Boolean) = + FpToBvExpr(roundingMode, op, size, sgn) - public static FpToFpExpr ToFp( - final FpRoundingMode roundingMode, - final Expr op, - final int exp, - final int sig) { - return FpToFpExpr.of(roundingMode, op, exp, sig); - } + @JvmStatic + fun ToFp(roundingMode: FpRoundingMode, op: Expr, exp: Int, sig: Int) = + FpToFpExpr(roundingMode, op, exp, sig) } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpFromBvExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpFromBvExpr.kt index ec213f5af1..4eee4c2f06 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpFromBvExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpFromBvExpr.kt @@ -13,118 +13,72 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.fptype; -import static com.google.common.base.Preconditions.checkNotNull; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.UnaryExpr; -import hu.bme.mit.theta.core.type.bvtype.BvLitExpr; -import hu.bme.mit.theta.core.type.bvtype.BvType; -import hu.bme.mit.theta.core.utils.BvUtils; -import hu.bme.mit.theta.core.utils.FpUtils; -import org.kframework.mpfr.BigFloat; -import org.kframework.mpfr.BinaryMathContext; - -public class FpFromBvExpr extends UnaryExpr { - - private static final int HASH_SEED = 6696; - private static final String OPERATOR_LABEL = "fpfrombv"; - - private final FpRoundingMode roundingMode; - private final FpType fpType; - private final boolean signed; - - private FpFromBvExpr( - final FpRoundingMode roundingMode, - final Expr op, - final FpType fpType, - final boolean signed) { - super(op); - this.fpType = fpType; - this.signed = signed; - checkNotNull(roundingMode); - this.roundingMode = roundingMode; - } - - public static FpFromBvExpr of( - final FpRoundingMode roundingMode, - final Expr op, - final FpType fpType, - final boolean signed) { - return new FpFromBvExpr(roundingMode, op, fpType, signed); - } - - public static FpFromBvExpr create( - final FpRoundingMode roundingMode, - final Expr op, - final FpType fpType, - final boolean signed) { - return FpFromBvExpr.of(roundingMode, op, fpType, signed); - } - - public FpRoundingMode getRoundingMode() { - return roundingMode; +package hu.bme.mit.theta.core.type.fptype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.UnaryExpr +import hu.bme.mit.theta.core.type.bvtype.BvLitExpr +import hu.bme.mit.theta.core.type.bvtype.BvType +import hu.bme.mit.theta.core.utils.BvUtils +import hu.bme.mit.theta.core.utils.FpUtils +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import org.kframework.mpfr.BigFloat + +@Serializable +@SerialName("FpFromBv") +data class FpFromBvExpr( + val roundingMode: FpRoundingMode, + override val op: Expr, + val fpType: FpType, + val signed: Boolean +) : UnaryExpr() { + + companion object { + + private const val OPERATOR_LABEL = "fpfrombv" + + @JvmStatic + fun of(roundingMode: FpRoundingMode, op: Expr, fpType: FpType, signed: Boolean) = + FpFromBvExpr(roundingMode, op, fpType, signed) + + @JvmStatic + fun create(roundingMode: FpRoundingMode, op: Expr, fpType: FpType, signed: Boolean): FpFromBvExpr = + of(roundingMode, op, fpType, signed) } - public FpType getFpType() { - return fpType; - } - - public boolean isSigned() { - return signed; - } + override val type: FpType get() = fpType - @Override - public FpType getType() { - return fpType; - } - - @Override - public FpLitExpr eval(Valuation val) { - BinaryMathContext mathContext = FpUtils.getMathContext(fpType, roundingMode); - BvLitExpr eval = (BvLitExpr) getOp().eval(val); + override fun eval(`val`: Valuation): FpLitExpr { + val mathContext = FpUtils.getMathContext(fpType, roundingMode) + val eval = op.eval(`val`) as BvLitExpr return FpUtils.bigFloatToFpLitExpr( - new BigFloat( - signed - ? BvUtils.signedBvLitExprToBigInteger(eval) - : BvUtils.unsignedBvLitExprToBigInteger(eval), - mathContext), - fpType); + BigFloat( + if (signed) + BvUtils.signedBvLitExprToBigInteger(eval) + else + BvUtils.unsignedBvLitExprToBigInteger(eval), + mathContext + ), + fpType + ) } - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && obj.getClass() == this.getClass()) { - final FpFromBvExpr that = (FpFromBvExpr) obj; - return this.getOp().equals(that.getOp()) - && fpType.equals(that.fpType) - && roundingMode.equals(that.roundingMode); - } else { - return false; - } - } + override fun of(op: Expr): FpFromBvExpr = + Companion.of(roundingMode, op, fpType, signed) - @Override - public FpFromBvExpr with(Expr op) { - return new FpFromBvExpr(roundingMode, op, fpType, signed); - } - - protected int getHashSeed() { - return HASH_SEED; - } + override val operatorLabel: String = + (OPERATOR_LABEL + + "[" + + fpType.exponent + + "," + + fpType.significand + + "][" + + (if (signed) "s" else "u") + + "]") - public String getOperatorLabel() { - return OPERATOR_LABEL - + "[" - + fpType.getExponent() - + "," - + fpType.getSignificand() - + "][" - + (isSigned() ? "s" : "u") - + "]"; - } + override fun toString(): String = super.toString() } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpGeqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpGeqExpr.kt index 916328d31b..6d747b0eb8 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpGeqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpGeqExpr.kt @@ -13,90 +13,48 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.fptype; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.utils.TypeUtils.castFp; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; +package hu.bme.mit.theta.core.type.fptype -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.GeqExpr; -import hu.bme.mit.theta.core.type.booltype.BoolLitExpr; -import hu.bme.mit.theta.core.type.booltype.BoolType; +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.GeqExpr +import hu.bme.mit.theta.core.type.booltype.BoolLitExpr +import hu.bme.mit.theta.core.utils.TypeUtils.castFp +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -public final class FpGeqExpr extends GeqExpr { - - private static final int HASH_SEED = 1647; - private static final String OPERATOR_LABEL = ">="; - - private FpGeqExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - checkAllTypesEqual(leftOp, rightOp); - } - - public static FpGeqExpr of(final Expr leftOp, final Expr rightOp) { - return new FpGeqExpr(leftOp, rightOp); - } - - public static FpGeqExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = castFp(leftOp); - final Expr newRightOp = castFp(rightOp); - return FpGeqExpr.of(newLeftOp, newRightOp); - } - - @Override - public BoolType getType() { - return Bool(); +@Serializable +@SerialName("FpGeq") +data class FpGeqExpr( + override val leftOp: Expr, + override val rightOp: Expr +) : GeqExpr() { + init { + checkAllTypesEqual(leftOp, rightOp) } - @Override - public BoolLitExpr eval(final Valuation val) { - final FpLitExpr leftOpVal = (FpLitExpr) getLeftOp().eval(val); - final FpLitExpr rightOpVal = (FpLitExpr) getRightOp().eval(val); + companion object { - return leftOpVal.geq(rightOpVal); - } - - @Override - public FpGeqExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return FpGeqExpr.of(leftOp, rightOp); - } - } - - @Override - public FpGeqExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } + @JvmStatic + fun of(leftOp: Expr, rightOp: Expr) = + FpGeqExpr(leftOp, rightOp) - @Override - public FpGeqExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + FpGeqExpr(castFp(leftOp), castFp(rightOp)) } - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final FpGeqExpr that = (FpGeqExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } + override fun eval(`val`: Valuation): BoolLitExpr { + val leftOpVal = leftOp.eval(`val`) as FpLitExpr + val rightOpVal = rightOp.eval(`val`) as FpLitExpr + return leftOpVal.geq(rightOpVal) } - @Override - protected int getHashSeed() { - return HASH_SEED; - } + override fun of(leftOp: Expr, rightOp: Expr): FpGeqExpr = + Companion.of(leftOp, rightOp) - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } + override fun toString(): String = super.toString() } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpGtExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpGtExpr.kt index 7eaca72c4b..390c0721f4 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpGtExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpGtExpr.kt @@ -13,90 +13,47 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.fptype; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.utils.TypeUtils.castFp; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; +package hu.bme.mit.theta.core.type.fptype -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.GtExpr; -import hu.bme.mit.theta.core.type.booltype.BoolLitExpr; -import hu.bme.mit.theta.core.type.booltype.BoolType; +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.GtExpr +import hu.bme.mit.theta.core.type.booltype.BoolLitExpr +import hu.bme.mit.theta.core.utils.TypeUtils.castFp +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -public final class FpGtExpr extends GtExpr { - - private static final int HASH_SEED = 1648; - private static final String OPERATOR_LABEL = ">"; - - private FpGtExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - checkAllTypesEqual(leftOp, rightOp); +@Serializable +@SerialName("FpGt") +data class FpGtExpr( + override val leftOp: Expr, + override val rightOp: Expr +) : GtExpr() { + init { + checkAllTypesEqual(leftOp, rightOp) } - public static FpGtExpr of(final Expr leftOp, final Expr rightOp) { - return new FpGtExpr(leftOp, rightOp); - } + companion object { + @JvmStatic + fun of(leftOp: Expr, rightOp: Expr) = + FpGtExpr(leftOp, rightOp) - public static FpGtExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = castFp(leftOp); - final Expr newRightOp = castFp(rightOp); - return FpGtExpr.of(newLeftOp, newRightOp); + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + FpGtExpr(castFp(leftOp), castFp(rightOp)) } - @Override - public BoolType getType() { - return Bool(); + override fun eval(`val`: Valuation): BoolLitExpr { + val leftOpVal = leftOp.eval(`val`) as FpLitExpr + val rightOpVal = rightOp.eval(`val`) as FpLitExpr + return leftOpVal.gt(rightOpVal) } - @Override - public BoolLitExpr eval(final Valuation val) { - final FpLitExpr leftOpVal = (FpLitExpr) getLeftOp().eval(val); - final FpLitExpr rightOpVal = (FpLitExpr) getRightOp().eval(val); - - return leftOpVal.gt(rightOpVal); - } - - @Override - public FpGtExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return FpGtExpr.of(leftOp, rightOp); - } - } - - @Override - public FpGtExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } + override fun of(leftOp: Expr, rightOp: Expr): FpGtExpr = + Companion.of(leftOp, rightOp) - @Override - public FpGtExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final FpGtExpr that = (FpGtExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } + override fun toString(): String = super.toString() } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpIsInfiniteExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpIsInfiniteExpr.kt index 4bbdb7557c..1746595e4f 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpIsInfiniteExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpIsInfiniteExpr.kt @@ -13,81 +13,48 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.fptype; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Or; -import static hu.bme.mit.theta.core.utils.TypeUtils.castFp; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; +package hu.bme.mit.theta.core.type.fptype -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.UnaryExpr; -import hu.bme.mit.theta.core.type.booltype.BoolLitExpr; -import hu.bme.mit.theta.core.type.booltype.BoolType; -import hu.bme.mit.theta.core.type.booltype.OrExpr; +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.UnaryExpr +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Or +import hu.bme.mit.theta.core.type.booltype.BoolLitExpr +import hu.bme.mit.theta.core.type.booltype.BoolType +import hu.bme.mit.theta.core.utils.TypeUtils.castFp +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -public final class FpIsInfiniteExpr extends UnaryExpr { +@Serializable +@SerialName("FpIsInfinite") +data class FpIsInfiniteExpr( + override val op: Expr +) : UnaryExpr() { - private static final int HASH_SEED = 1756; - private static final String OPERATOR_LABEL = "isinfinite"; + companion object { + private const val OPERATOR_LABEL = "isinfinite" - private FpIsInfiniteExpr(final Expr op) { - super(op); - checkAllTypesEqual(op); - } - - public static FpIsInfiniteExpr of(final Expr op) { - return new FpIsInfiniteExpr(op); - } + @JvmStatic + fun of(op: Expr) = FpIsInfiniteExpr(op) - public static FpIsInfiniteExpr create(final Expr op) { - final Expr newOp = castFp(op); - return FpIsInfiniteExpr.of(newOp); + @JvmStatic + fun create(op: Expr<*>) = FpIsInfiniteExpr(castFp(op)) } - @Override - public UnaryExpr with(Expr op) { - if (op == getOp()) { - return this; - } else { - return FpIsInfiniteExpr.of(op); - } - } + override val type: BoolType get() = Bool() - @Override - public BoolType getType() { - return Bool(); + override fun eval(`val`: Valuation): BoolLitExpr { + val opVal = op.eval(`val`) as FpLitExpr + val or = Or(Bool(opVal.isNegativeInfinity()), Bool(opVal.isPositiveInfinity())) + return or.eval(`val`) } - @Override - public BoolLitExpr eval(final Valuation val) { - final FpLitExpr opVal = (FpLitExpr) getOp().eval(val); + override fun of(op: Expr): FpIsInfiniteExpr = Companion.of(op) - OrExpr or = Or(Bool(opVal.isNegativeInfinity()), Bool(opVal.isPositiveInfinity())); - final BoolLitExpr boolExpr = or.eval(val); - return boolExpr; - } + override val operatorLabel: String get() = OPERATOR_LABEL - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final FpIsInfiniteExpr that = (FpIsInfiniteExpr) obj; - return this.getOp().equals(that.getOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } + override fun toString(): String = super.toString() } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpIsNanExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpIsNanExpr.kt index 9a95a85d7f..ea27b7fa27 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpIsNanExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpIsNanExpr.kt @@ -13,77 +13,43 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.fptype; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.utils.TypeUtils.castFp; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; +package hu.bme.mit.theta.core.type.fptype -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.UnaryExpr; -import hu.bme.mit.theta.core.type.booltype.BoolLitExpr; -import hu.bme.mit.theta.core.type.booltype.BoolType; +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.UnaryExpr +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool +import hu.bme.mit.theta.core.type.booltype.BoolLitExpr +import hu.bme.mit.theta.core.type.booltype.BoolType +import hu.bme.mit.theta.core.utils.TypeUtils.castFp +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -public final class FpIsNanExpr extends UnaryExpr { +@Serializable +@SerialName("FpIsNan") +data class FpIsNanExpr( + override val op: Expr +) : UnaryExpr() { - private static final int HASH_SEED = 1786; - private static final String OPERATOR_LABEL = "fpisnan"; + companion object { + private const val OPERATOR_LABEL = "fpisnan" - private FpIsNanExpr(final Expr op) { - super(op); - checkAllTypesEqual(op); - } - - public static FpIsNanExpr of(final Expr op) { - return new FpIsNanExpr(op); - } - - public static FpIsNanExpr create(final Expr op) { - final Expr newOp = castFp(op); - return FpIsNanExpr.of(newOp); - } - - @Override - public UnaryExpr with(Expr op) { - if (op == getOp()) { - return this; - } else { - return FpIsNanExpr.of(op); - } - } + @JvmStatic + fun of(op: Expr) = FpIsNanExpr(op) - @Override - public BoolType getType() { - return Bool(); + @JvmStatic + fun create(op: Expr<*>) = FpIsNanExpr(castFp(op)) } - @Override - public BoolLitExpr eval(final Valuation val) { - final FpLitExpr opVal = (FpLitExpr) getOp().eval(val); + override val type: BoolType get() = Bool() - return Bool(opVal.isNaN()); - } + override fun eval(`val`: Valuation): BoolLitExpr = Bool((op.eval(`val`) as FpLitExpr).isNaN()) - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final FpIsNanExpr that = (FpIsNanExpr) obj; - return this.getOp().equals(that.getOp()); - } else { - return false; - } - } + override fun of(op: Expr): FpIsNanExpr = Companion.of(op) - @Override - protected int getHashSeed() { - return HASH_SEED; - } + override val operatorLabel: String get() = OPERATOR_LABEL - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } + override fun toString(): String = super.toString() } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpLeqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpLeqExpr.kt index 2576f3fccf..2be80ac5d8 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpLeqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpLeqExpr.kt @@ -13,90 +13,47 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.fptype; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.utils.TypeUtils.castFp; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; +package hu.bme.mit.theta.core.type.fptype -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.LeqExpr; -import hu.bme.mit.theta.core.type.booltype.BoolLitExpr; -import hu.bme.mit.theta.core.type.booltype.BoolType; +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.LeqExpr +import hu.bme.mit.theta.core.type.booltype.BoolLitExpr +import hu.bme.mit.theta.core.utils.TypeUtils.castFp +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -public final class FpLeqExpr extends LeqExpr { - - private static final int HASH_SEED = 1649; - private static final String OPERATOR_LABEL = "<="; - - private FpLeqExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - checkAllTypesEqual(leftOp, rightOp); +@Serializable +@SerialName("FpLeq") +data class FpLeqExpr( + override val leftOp: Expr, + override val rightOp: Expr +) : LeqExpr() { + init { + checkAllTypesEqual(leftOp, rightOp) } - public static FpLeqExpr of(final Expr leftOp, final Expr rightOp) { - return new FpLeqExpr(leftOp, rightOp); - } + companion object { + @JvmStatic + fun of(leftOp: Expr, rightOp: Expr) = + FpLeqExpr(leftOp, rightOp) - public static FpLeqExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = castFp(leftOp); - final Expr newRightOp = castFp(rightOp); - return FpLeqExpr.of(newLeftOp, newRightOp); + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + FpLeqExpr(castFp(leftOp), castFp(rightOp)) } - @Override - public BoolType getType() { - return Bool(); + override fun eval(`val`: Valuation): BoolLitExpr { + val leftOpVal = leftOp.eval(`val`) as FpLitExpr + val rightOpVal = rightOp.eval(`val`) as FpLitExpr + return leftOpVal.leq(rightOpVal) } - @Override - public BoolLitExpr eval(final Valuation val) { - final FpLitExpr leftOpVal = (FpLitExpr) getLeftOp().eval(val); - final FpLitExpr rightOpVal = (FpLitExpr) getRightOp().eval(val); - - return leftOpVal.leq(rightOpVal); - } - - @Override - public FpLeqExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return FpLeqExpr.of(leftOp, rightOp); - } - } - - @Override - public FpLeqExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } + override fun of(leftOp: Expr, rightOp: Expr): FpLeqExpr = + Companion.of(leftOp, rightOp) - @Override - public FpLeqExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final FpLeqExpr that = (FpLeqExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } + override fun toString(): String = super.toString() } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpLitExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpLitExpr.kt index 4ca92763e9..81478f136e 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpLitExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpLitExpr.kt @@ -13,318 +13,259 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.fptype; -import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.base.Preconditions.checkNotNull; -import static hu.bme.mit.theta.core.utils.FpUtils.bigFloatToFpLitExpr; -import static hu.bme.mit.theta.core.utils.FpUtils.fpLitExprToBigFloat; -import static hu.bme.mit.theta.core.utils.FpUtils.getMathContext; - -import hu.bme.mit.theta.common.Utils; -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.type.NullaryExpr; -import hu.bme.mit.theta.core.type.booltype.BoolExprs; -import hu.bme.mit.theta.core.type.booltype.BoolLitExpr; -import hu.bme.mit.theta.core.type.bvtype.BvLitExpr; -import java.util.Arrays; - -public class FpLitExpr extends NullaryExpr implements LitExpr, Comparable { - private static final int HASH_SEED = 4254; - private final boolean hidden; - private final BvLitExpr exponent; - private final BvLitExpr significand; - private volatile int hashCode = 0; - - private FpLitExpr(final boolean hidden, final BvLitExpr exponent, final BvLitExpr significand) { - checkNotNull(exponent); - checkNotNull(significand); - - this.hidden = hidden; - this.exponent = exponent; - this.significand = significand; - } - - public static FpLitExpr of( - final boolean hidden, final BvLitExpr exponent, final BvLitExpr significand) { - return new FpLitExpr(hidden, exponent, significand); - } - - public static FpLitExpr of(final BvLitExpr value, final FpType fpType) { - boolean[] literal = value.getValue(); - checkArgument(fpType.getExponent() + fpType.getSignificand() + 1 == literal.length); - return new FpLitExpr( +package hu.bme.mit.theta.core.type.fptype + +import hu.bme.mit.theta.common.Utils +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.type.NullaryExpr +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool +import hu.bme.mit.theta.core.type.booltype.BoolExprs.False +import hu.bme.mit.theta.core.type.booltype.BoolExprs.True +import hu.bme.mit.theta.core.type.booltype.BoolLitExpr +import hu.bme.mit.theta.core.type.bvtype.BvLitExpr +import hu.bme.mit.theta.core.utils.FpUtils.* +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import java.util.* + +@Serializable +@SerialName("FpLit") +data class FpLitExpr( + val hidden: Boolean, + val exponent: BvLitExpr, + val significand: BvLitExpr +) : NullaryExpr(), LitExpr, Comparable { + + companion object { + + @JvmStatic + fun of(hidden: Boolean, exponent: BvLitExpr, significand: BvLitExpr) = + FpLitExpr(hidden, exponent, significand) + + @JvmStatic + fun of(value: BvLitExpr, fpType: FpType): FpLitExpr { + val literal = value.value + require(fpType.exponent + fpType.significand + 1 == literal.size) + return FpLitExpr( literal[0], - BvLitExpr.of(Arrays.copyOfRange(literal, 1, fpType.getExponent() + 1)), + BvLitExpr.of(Arrays.copyOfRange(literal, 1, fpType.exponent + 1)), BvLitExpr.of( - Arrays.copyOfRange( - literal, - fpType.getExponent() + 1, - fpType.getExponent() + fpType.getSignificand() + 1))); - } - - public static FpLitExpr of( - final BvLitExpr hidden, final BvLitExpr exponent, final BvLitExpr significand) { - boolean[] hiddenLit = hidden.getValue(); - return new FpLitExpr(hiddenLit[0], exponent, significand); - } - - public boolean getHidden() { - return hidden; - } + Arrays.copyOfRange( + literal, + fpType.exponent + 1, + fpType.exponent + fpType.significand + 1 + ) + ) + ) + } - public BvLitExpr getExponent() { - return exponent; + @JvmStatic + fun of(hidden: BvLitExpr, exponent: BvLitExpr, significand: BvLitExpr): FpLitExpr { + val hiddenLit = hidden.value + return FpLitExpr(hiddenLit[0], exponent, significand) + } } - public BvLitExpr getSignificand() { - return significand; - } + override val type: FpType get() = FpType(exponent.type.size, significand.type.size) + override fun eval(`val`: Valuation): FpLitExpr = this - public boolean isNaN() { - var isNaN = true; - for (final var i : exponent.getValue()) { - isNaN = isNaN && i; + fun isNaN(): Boolean { + var isNaN = true + for (i in exponent.value) { + isNaN = isNaN && i } - var atLeastOne = false; - for (final var i : significand.getValue()) { - atLeastOne = atLeastOne || i; + var atLeastOne = false + for (i in significand.value) { + atLeastOne = atLeastOne || i } - return isNaN && atLeastOne; + return isNaN && atLeastOne } - public boolean isPositiveInfinity() { - var isNaN = !hidden; - for (final var i : exponent.getValue()) { - isNaN = isNaN && i; + fun isPositiveInfinity(): Boolean { + var isNaN = !hidden + for (i in exponent.value) { + isNaN = isNaN && i } - for (final var i : significand.getValue()) { - isNaN = isNaN && !i; + for (i in significand.value) { + isNaN = isNaN && !i } - return isNaN; + return isNaN } - public boolean isNegativeInfinity() { - var isNaN = hidden; - for (final var i : exponent.getValue()) { - isNaN = isNaN && i; + fun isNegativeInfinity(): Boolean { + var isNaN = hidden + for (i in exponent.value) { + isNaN = isNaN && i } - for (final var i : significand.getValue()) { - isNaN = isNaN && !i; + for (i in significand.value) { + isNaN = isNaN && !i } - return isNaN; + return isNaN } - public boolean isNegativeZero() { - var isNaN = !hidden; - for (final var i : exponent.getValue()) { - isNaN = isNaN && !i; + fun isNegativeZero(): Boolean { + var isNaN = !hidden + for (i in exponent.value) { + isNaN = isNaN && !i } - for (final var i : significand.getValue()) { - isNaN = isNaN && !i; + for (i in significand.value) { + isNaN = isNaN && !i } - return isNaN; + return isNaN } - public boolean isPositiveZero() { - var isNaN = hidden; - for (final var i : exponent.getValue()) { - isNaN = isNaN && !i; + fun isPositiveZero(): Boolean { + var isNaN = hidden + for (i in exponent.value) { + isNaN = isNaN && !i } - for (final var i : significand.getValue()) { - isNaN = isNaN && !i; + for (i in significand.value) { + isNaN = isNaN && !i } - return isNaN; + return isNaN } - public FpLitExpr add(final FpRoundingMode roundingMode, final FpLitExpr that) { - checkArgument(this.getType().equals(that.getType())); - var sum = - fpLitExprToBigFloat(roundingMode, this) - .add( - fpLitExprToBigFloat(roundingMode, that), - getMathContext(this.getType(), roundingMode)); - return bigFloatToFpLitExpr(sum, getType()); + fun add(roundingMode: FpRoundingMode, that: FpLitExpr): FpLitExpr { + require(this.type == that.type) + val sum = + fpLitExprToBigFloat(roundingMode, this) + .add( + fpLitExprToBigFloat(roundingMode, that), + getMathContext(this.type, roundingMode) + ) + return bigFloatToFpLitExpr(sum, type) } - public FpLitExpr sub(final FpRoundingMode roundingMode, final FpLitExpr that) { - checkArgument(this.getType().equals(that.getType())); - var sub = - fpLitExprToBigFloat(roundingMode, this) - .subtract( - fpLitExprToBigFloat(roundingMode, that), - getMathContext(this.getType(), roundingMode)); - return bigFloatToFpLitExpr(sub, getType()); + fun sub(roundingMode: FpRoundingMode, that: FpLitExpr): FpLitExpr { + require(this.type == that.type) + val sub = + fpLitExprToBigFloat(roundingMode, this) + .subtract( + fpLitExprToBigFloat(roundingMode, that), + getMathContext(this.type, roundingMode) + ) + return bigFloatToFpLitExpr(sub, type) } - public FpLitExpr pos() { - return this; - } + fun pos(): FpLitExpr = this - public FpLitExpr neg() { - var neg = fpLitExprToBigFloat(FpRoundingMode.getDefaultRoundingMode(), this).negate(); - return bigFloatToFpLitExpr(neg, getType()); + fun neg(): FpLitExpr { + val neg = fpLitExprToBigFloat(FpRoundingMode.defaultRoundingMode, this).negate() + return bigFloatToFpLitExpr(neg, type) } - public FpLitExpr mul(final FpRoundingMode roundingMode, final FpLitExpr that) { - checkArgument(this.getType().equals(that.getType())); - var sub = - fpLitExprToBigFloat(roundingMode, this) - .multiply( - fpLitExprToBigFloat(roundingMode, that), - getMathContext(this.getType(), roundingMode)); - return bigFloatToFpLitExpr(sub, getType()); + fun mul(roundingMode: FpRoundingMode, that: FpLitExpr): FpLitExpr { + require(this.type == that.type) + val sub = + fpLitExprToBigFloat(roundingMode, this) + .multiply( + fpLitExprToBigFloat(roundingMode, that), + getMathContext(this.type, roundingMode) + ) + return bigFloatToFpLitExpr(sub, type) } - public FpLitExpr div(final FpRoundingMode roundingMode, final FpLitExpr that) { - checkArgument(this.getType().equals(that.getType())); - var sub = - fpLitExprToBigFloat(roundingMode, this) - .divide( - fpLitExprToBigFloat(roundingMode, that), - getMathContext(this.getType(), roundingMode)); - return bigFloatToFpLitExpr(sub, getType()); + fun div(roundingMode: FpRoundingMode, that: FpLitExpr): FpLitExpr { + require(this.type == that.type) + val sub = + fpLitExprToBigFloat(roundingMode, this) + .divide( + fpLitExprToBigFloat(roundingMode, that), + getMathContext(this.type, roundingMode) + ) + return bigFloatToFpLitExpr(sub, type) } - public BoolLitExpr eq(final FpLitExpr that) { - checkArgument(this.getType().equals(that.getType())); - var left = fpLitExprToBigFloat(FpRoundingMode.getDefaultRoundingMode(), this); - var right = fpLitExprToBigFloat(FpRoundingMode.getDefaultRoundingMode(), that); - if (left.isNaN() || right.isNaN()) { - return BoolExprs.False(); + fun eq(that: FpLitExpr): BoolLitExpr { + require(this.type == that.type) + val left = fpLitExprToBigFloat(FpRoundingMode.defaultRoundingMode, this) + val right = fpLitExprToBigFloat(FpRoundingMode.defaultRoundingMode, that) + if (left.isNaN || right.isNaN) { + return False() } - return BoolExprs.Bool( - this.hidden == that.hidden - && this.exponent.equals(that.exponent) - && this.significand.equals(that.significand)); + return Bool(this.hidden == that.hidden && exponent == that.exponent && significand == that.significand) } - public BoolLitExpr assign(final FpLitExpr that) { - checkArgument(this.getType().equals(that.getType())); - var left = fpLitExprToBigFloat(FpRoundingMode.getDefaultRoundingMode(), this); - var right = fpLitExprToBigFloat(FpRoundingMode.getDefaultRoundingMode(), that); - return BoolExprs.Bool( - this.hidden == that.hidden - && this.exponent.equals(that.exponent) - && this.significand.equals(that.significand)); + fun assign(that: FpLitExpr): BoolLitExpr { + require(this.type == that.type) + val left = fpLitExprToBigFloat(FpRoundingMode.defaultRoundingMode, this) + val right = fpLitExprToBigFloat(FpRoundingMode.defaultRoundingMode, that) + return Bool(this.hidden == that.hidden && exponent == that.exponent && significand == that.significand) } - public BoolLitExpr gt(final FpLitExpr that) { - checkArgument(this.getType().equals(that.getType())); - var left = fpLitExprToBigFloat(FpRoundingMode.getDefaultRoundingMode(), this); - var right = fpLitExprToBigFloat(FpRoundingMode.getDefaultRoundingMode(), that); - if (left.isNaN() || right.isNaN()) { - return BoolExprs.False(); + fun gt(that: FpLitExpr): BoolLitExpr { + require(this.type == that.type) + val left = fpLitExprToBigFloat(FpRoundingMode.defaultRoundingMode, this) + val right = fpLitExprToBigFloat(FpRoundingMode.defaultRoundingMode, that) + if (left.isNaN || right.isNaN) { + return False() } - if (left.greaterThan(right)) { - return BoolExprs.True(); + return if (left.greaterThan(right)) { + True() } else { - return BoolExprs.False(); + False() } } - public BoolLitExpr lt(final FpLitExpr that) { - checkArgument(this.getType().equals(that.getType())); - var left = fpLitExprToBigFloat(FpRoundingMode.getDefaultRoundingMode(), this); - var right = fpLitExprToBigFloat(FpRoundingMode.getDefaultRoundingMode(), that); - if (left.isNaN() || right.isNaN()) { - return BoolExprs.False(); + fun lt(that: FpLitExpr): BoolLitExpr { + require(this.type == that.type) + val left = fpLitExprToBigFloat(FpRoundingMode.defaultRoundingMode, this) + val right = fpLitExprToBigFloat(FpRoundingMode.defaultRoundingMode, that) + if (left.isNaN || right.isNaN) { + return False() } - if (left.lessThan(right)) { - return BoolExprs.True(); + return if (left.lessThan(right)) { + True() } else { - return BoolExprs.False(); + False() } } - public BoolLitExpr geq(final FpLitExpr that) { - checkArgument(this.getType().equals(that.getType())); - var left = fpLitExprToBigFloat(FpRoundingMode.getDefaultRoundingMode(), this); - var right = fpLitExprToBigFloat(FpRoundingMode.getDefaultRoundingMode(), that); - if (left.isNaN() || right.isNaN()) { - return BoolExprs.False(); + fun geq(that: FpLitExpr): BoolLitExpr { + require(this.type == that.type) + val left = fpLitExprToBigFloat(FpRoundingMode.defaultRoundingMode, this) + val right = fpLitExprToBigFloat(FpRoundingMode.defaultRoundingMode, that) + if (left.isNaN || right.isNaN) { + return False() } - if (left.greaterThanOrEqualTo(right)) { - return BoolExprs.True(); + return if (left.greaterThanOrEqualTo(right)) { + True() } else { - return BoolExprs.False(); + False() } } - public BoolLitExpr leq(final FpLitExpr that) { - checkArgument(this.getType().equals(that.getType())); - var left = fpLitExprToBigFloat(FpRoundingMode.getDefaultRoundingMode(), this); - var right = fpLitExprToBigFloat(FpRoundingMode.getDefaultRoundingMode(), that); - if (left.isNaN() || right.isNaN()) { - return BoolExprs.False(); + fun leq(that: FpLitExpr): BoolLitExpr { + require(this.type == that.type) + val left = fpLitExprToBigFloat(FpRoundingMode.defaultRoundingMode, this) + val right = fpLitExprToBigFloat(FpRoundingMode.defaultRoundingMode, that) + if (left.isNaN || right.isNaN) { + return False() } - if (left.lessThanOrEqualTo(right)) { - return BoolExprs.True(); + return if (left.lessThanOrEqualTo(right)) { + True() } else { - return BoolExprs.False(); + False() } } - public BoolLitExpr neq(final FpLitExpr that) { - checkArgument(this.getType().equals(that.getType())); - var left = fpLitExprToBigFloat(FpRoundingMode.getDefaultRoundingMode(), this); - var right = fpLitExprToBigFloat(FpRoundingMode.getDefaultRoundingMode(), that); - if (left.isNaN() || right.isNaN()) { - return BoolExprs.False(); + fun neq(that: FpLitExpr): BoolLitExpr { + require(this.type == that.type) + val left = fpLitExprToBigFloat(FpRoundingMode.defaultRoundingMode, this) + val right = fpLitExprToBigFloat(FpRoundingMode.defaultRoundingMode, that) + if (left.isNaN || right.isNaN) { + return False() } - return BoolExprs.Bool( - !(this.hidden == that.hidden - && this.exponent.equals(that.exponent) - && this.significand.equals(that.significand))); - } - - @Override - public FpType getType() { - return FpType.of(exponent.getType().getSize(), significand.getType().getSize() + 1); - } - - @Override - public LitExpr eval(Valuation val) { - return this; + return Bool(!(this.hidden == that.hidden && exponent == that.exponent && significand == that.significand)) } - @Override - public int hashCode() { - int result = hashCode; - if (result == 0) { - result = HASH_SEED; - result = 31 * result + Boolean.hashCode(hidden); - result = 31 * result + exponent.hashCode(); - result = 31 * result + significand.hashCode(); - hashCode = result; - } - return result; - } + override fun toString(): String = Utils.lispStringBuilder(if (hidden) "#b1" else "#b0") + .add(exponent.toString()) + .add(significand.toString()) + .toString() - @Override - public boolean equals(final Object obj) { - if (obj != null - && this.getClass() == obj.getClass() - && getType().equals(((FpLitExpr) obj).getType())) { - return this.exponent.equals(((FpLitExpr) obj).exponent) - && this.hidden == ((FpLitExpr) obj).hidden - && this.significand.equals(((FpLitExpr) obj).significand); - } else { - return false; - } - } - - @Override - public String toString() { - return Utils.lispStringBuilder(hidden ? "#b1" : "#b0") - .add(exponent.toString()) - .add(significand.toString()) - .toString(); - } - - @Override - public int compareTo(FpType fpType) { - return 0; - } + override fun compareTo(other: FpType): Int = 0 } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpLtExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpLtExpr.kt index 7e9c2847f9..c5eba6ed20 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpLtExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpLtExpr.kt @@ -13,90 +13,49 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.fptype; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.utils.TypeUtils.castFp; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; +package hu.bme.mit.theta.core.type.fptype -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.LtExpr; -import hu.bme.mit.theta.core.type.booltype.BoolLitExpr; -import hu.bme.mit.theta.core.type.booltype.BoolType; +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.LtExpr +import hu.bme.mit.theta.core.type.booltype.BoolLitExpr +import hu.bme.mit.theta.core.utils.TypeUtils.castFp +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -public final class FpLtExpr extends LtExpr { +@Serializable +@SerialName("FpLt") +data class FpLtExpr( + override val leftOp: Expr, + override val rightOp: Expr +) : LtExpr() { - private static final int HASH_SEED = 1745; - private static final String OPERATOR_LABEL = "<"; - - private FpLtExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - checkAllTypesEqual(leftOp, rightOp); - } - - public static FpLtExpr of(final Expr leftOp, final Expr rightOp) { - return new FpLtExpr(leftOp, rightOp); - } - - public static FpLtExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = castFp(leftOp); - final Expr newRightOp = castFp(rightOp); - return FpLtExpr.of(newLeftOp, newRightOp); + init { + checkAllTypesEqual(leftOp, rightOp) } - @Override - public BoolType getType() { - return Bool(); - } + companion object { - @Override - public BoolLitExpr eval(final Valuation val) { - final FpLitExpr leftOpVal = (FpLitExpr) getLeftOp().eval(val); - final FpLitExpr rightOpVal = (FpLitExpr) getRightOp().eval(val); + @JvmStatic + fun of(leftOp: Expr, rightOp: Expr) = + FpLtExpr(leftOp, rightOp) - return leftOpVal.lt(rightOpVal); + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + FpLtExpr(castFp(leftOp), castFp(rightOp)) } - @Override - public FpLtExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return FpLtExpr.of(leftOp, rightOp); - } + override fun eval(`val`: Valuation): BoolLitExpr { + val leftOpVal = leftOp.eval(`val`) as FpLitExpr + val rightOpVal = rightOp.eval(`val`) as FpLitExpr + return leftOpVal.lt(rightOpVal) } - @Override - public FpLtExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } + override fun of(leftOp: Expr, rightOp: Expr): FpLtExpr = + Companion.of(leftOp, rightOp) - @Override - public FpLtExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final FpLtExpr that = (FpLtExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } + override fun toString(): String = super.toString() } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpMaxExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpMaxExpr.kt index 3e9e97137c..bec8f54895 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpMaxExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpMaxExpr.kt @@ -13,95 +13,62 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.fptype; -import static com.google.common.base.Preconditions.checkNotNull; -import static hu.bme.mit.theta.core.utils.TypeUtils.castFp; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; +package hu.bme.mit.theta.core.type.fptype -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.BinaryExpr; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.utils.FpUtils; +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.BinaryExpr +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.utils.FpUtils +import hu.bme.mit.theta.core.utils.TypeUtils.castFp +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -public class FpMaxExpr extends BinaryExpr { +@Serializable +@SerialName("FpMax") +data class FpMaxExpr( + override val leftOp: Expr, + override val rightOp: Expr +) : BinaryExpr() { - private static final int HASH_SEED = 6668; - private static final String OPERATOR_LABEL = "fpmax"; - - private FpMaxExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - checkAllTypesEqual(leftOp, rightOp); + init { + checkAllTypesEqual(leftOp, rightOp) } - public static FpMaxExpr of(final Expr leftOp, final Expr rightOp) { - return new FpMaxExpr(leftOp, rightOp); - } + companion object { - public static FpMaxExpr create(final Expr leftOp, final Expr rightOp) { - checkNotNull(leftOp, rightOp); - final Expr newLeftOp = castFp(leftOp); - final Expr newRightOp = castFp(rightOp); - return FpMaxExpr.of(newLeftOp, newRightOp); - } - - @Override - public BinaryExpr with(Expr leftOp, Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return FpMaxExpr.of(leftOp, rightOp); - } - } + private const val OPERATOR_LABEL = "fpmax" - @Override - public BinaryExpr withLeftOp(Expr leftOp) { - return with(leftOp, getRightOp()); - } + @JvmStatic + fun of(leftOp: Expr, rightOp: Expr) = + FpMaxExpr(leftOp, rightOp) - @Override - public BinaryExpr withRightOp(Expr rightOp) { - return with(getLeftOp(), rightOp); + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + FpMaxExpr(castFp(leftOp), castFp(rightOp)) } - @Override - protected int getHashSeed() { - return HASH_SEED; - } + override val type: FpType get() = leftOp.type - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } - - @Override - public FpType getType() { - return getLeftOp().getType(); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final FpMaxExpr that = (FpMaxExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); + override fun eval(`val`: Valuation): LitExpr { + val leftOpVal = leftOp.eval(`val`) as FpLitExpr + val rightOpVal = rightOp.eval(`val`) as FpLitExpr + return if (FpUtils.fpLitExprToBigFloat(null, leftOpVal) + .greaterThan(FpUtils.fpLitExprToBigFloat(null, rightOpVal)) + ) { + leftOpVal } else { - return false; + rightOpVal } } - @Override - public LitExpr eval(Valuation val) { - final FpLitExpr leftOpVal = (FpLitExpr) getLeftOp().eval(val); - final FpLitExpr rightOpVal = (FpLitExpr) getRightOp().eval(val); - if (FpUtils.fpLitExprToBigFloat(null, leftOpVal) - .greaterThan(FpUtils.fpLitExprToBigFloat(null, rightOpVal))) { - return leftOpVal; - } else { - return rightOpVal; - } - } + override fun of(leftOp: Expr, rightOp: Expr): FpMaxExpr = + Companion.of(leftOp, rightOp) + + override val operatorLabel: String get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpMinExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpMinExpr.kt index f78442635f..0ef938ead2 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpMinExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpMinExpr.kt @@ -13,95 +13,62 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.fptype; -import static com.google.common.base.Preconditions.checkNotNull; -import static hu.bme.mit.theta.core.utils.TypeUtils.castFp; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; +package hu.bme.mit.theta.core.type.fptype -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.BinaryExpr; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.utils.FpUtils; +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.BinaryExpr +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.utils.FpUtils +import hu.bme.mit.theta.core.utils.TypeUtils.castFp +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -public class FpMinExpr extends BinaryExpr { +@Serializable +@SerialName("FpMin") +data class FpMinExpr( + override val leftOp: Expr, + override val rightOp: Expr +) : BinaryExpr() { - private static final int HASH_SEED = 6667; - private static final String OPERATOR_LABEL = "fpmin"; - - private FpMinExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - checkAllTypesEqual(leftOp, rightOp); + init { + checkAllTypesEqual(leftOp, rightOp) } - public static FpMinExpr of(final Expr leftOp, final Expr rightOp) { - return new FpMinExpr(leftOp, rightOp); - } + companion object { - public static FpMinExpr create(final Expr leftOp, final Expr rightOp) { - checkNotNull(leftOp, rightOp); - final Expr newLeftOp = castFp(leftOp); - final Expr newRightOp = castFp(rightOp); - return FpMinExpr.of(newLeftOp, newRightOp); - } - - @Override - public BinaryExpr with(Expr leftOp, Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return FpMinExpr.of(leftOp, rightOp); - } - } + private const val OPERATOR_LABEL = "fpmin" - @Override - public BinaryExpr withLeftOp(Expr leftOp) { - return with(leftOp, getRightOp()); - } + @JvmStatic + fun of(leftOp: Expr, rightOp: Expr) = + FpMinExpr(leftOp, rightOp) - @Override - public BinaryExpr withRightOp(Expr rightOp) { - return with(getLeftOp(), rightOp); + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + FpMinExpr(castFp(leftOp), castFp(rightOp)) } - @Override - protected int getHashSeed() { - return HASH_SEED; - } + override val type: FpType get() = leftOp.type - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } - - @Override - public FpType getType() { - return getLeftOp().getType(); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final FpMinExpr that = (FpMinExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); + override fun eval(`val`: Valuation): LitExpr { + val leftOpVal = leftOp.eval(`val`) as FpLitExpr + val rightOpVal = rightOp.eval(`val`) as FpLitExpr + return if (FpUtils.fpLitExprToBigFloat(null, leftOpVal) + .lessThan(FpUtils.fpLitExprToBigFloat(null, rightOpVal)) + ) { + leftOpVal } else { - return false; + rightOpVal } } - @Override - public LitExpr eval(Valuation val) { - final FpLitExpr leftOpVal = (FpLitExpr) getLeftOp().eval(val); - final FpLitExpr rightOpVal = (FpLitExpr) getRightOp().eval(val); - if (FpUtils.fpLitExprToBigFloat(null, leftOpVal) - .lessThan(FpUtils.fpLitExprToBigFloat(null, rightOpVal))) { - return leftOpVal; - } else { - return rightOpVal; - } - } + override fun of(leftOp: Expr, rightOp: Expr): FpMinExpr = + Companion.of(leftOp, rightOp) + + override val operatorLabel: String get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpMulExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpMulExpr.kt index 50ad817027..d6ff650d03 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpMulExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpMulExpr.kt @@ -13,92 +13,52 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.fptype; -import static com.google.common.base.Preconditions.checkNotNull; -import static com.google.common.collect.ImmutableList.toImmutableList; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; +package hu.bme.mit.theta.core.type.fptype -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.MulExpr; -import hu.bme.mit.theta.core.utils.TypeUtils; -import java.util.List; +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.MulExpr +import hu.bme.mit.theta.core.utils.TypeUtils.castFp +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -public class FpMulExpr extends MulExpr { +@Serializable +@SerialName("FpMul") +data class FpMulExpr( + val roundingMode: FpRoundingMode, + override val ops: List> +) : MulExpr() { - private static final int HASH_SEED = 4276; - private static final String OPERATOR_LABEL = "fpmul"; - - private final FpRoundingMode roundingMode; - - private FpMulExpr( - final FpRoundingMode roundingMode, final Iterable> ops) { - super(ops); - checkAllTypesEqual(ops); - checkNotNull(roundingMode); - this.roundingMode = roundingMode; + init { + checkAllTypesEqual(ops) } - public static FpMulExpr of( - final FpRoundingMode roundingMode, final Iterable> ops) { - return new FpMulExpr(roundingMode, ops); - } + companion object { - public static FpMulExpr create( - final FpRoundingMode roundingMode, final List> ops) { - checkNotNull(ops); - return FpMulExpr.of( - roundingMode, ops.stream().map(TypeUtils::castFp).collect(toImmutableList())); - } + private const val OPERATOR_LABEL = "fpmul" - public FpRoundingMode getRoundingMode() { - return roundingMode; - } + @JvmStatic + fun of(roundingMode: FpRoundingMode, ops: Iterable>) = + FpMulExpr(roundingMode, ops.toList()) - @Override - public FpType getType() { - return getOps().get(0).getType(); + @JvmStatic + fun create(roundingMode: FpRoundingMode, ops: List>) = + FpMulExpr(roundingMode, ops.map { castFp(it) }) } - @Override - public FpLitExpr eval(final Valuation val) { - return getOps().stream() - .skip(1) - .reduce( - (FpLitExpr) getOps().get(0).eval(val), - (op1, op2) -> (op1.mul(roundingMode, (FpLitExpr) op2.eval(val))), - (op1, op2) -> (op1.mul(roundingMode, op2))); - } + override val type: FpType get() = ops[0].type - @Override - public FpMulExpr with(final Iterable> ops) { - if (ops == getOps()) { - return this; - } else { - return FpMulExpr.of(roundingMode, ops); + override fun eval(`val`: Valuation): FpLitExpr = + ops.drop(1).fold(ops[0].eval(`val`) as FpLitExpr) { acc, op -> + acc.mul(roundingMode, op.eval(`val`) as FpLitExpr) } - } - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final FpMulExpr that = (FpMulExpr) obj; - return this.getOps().equals(that.getOps()) && roundingMode == that.roundingMode; - } else { - return false; - } - } + override fun of(ops: List>): FpMulExpr = Companion.of(roundingMode, ops) - @Override - protected int getHashSeed() { - return HASH_SEED; - } + override val operatorLabel: String get() = OPERATOR_LABEL - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } + override fun toString(): String = super.toString() } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpNegExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpNegExpr.kt index dbe07ef320..8af7d022a8 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpNegExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpNegExpr.kt @@ -13,71 +13,42 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.fptype; -import static hu.bme.mit.theta.core.utils.TypeUtils.castFp; +package hu.bme.mit.theta.core.type.fptype -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.NegExpr; +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.NegExpr +import hu.bme.mit.theta.core.utils.TypeUtils.castFp +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -public final class FpNegExpr extends NegExpr { +@Serializable +@SerialName("FpNeg") +data class FpNegExpr( + override val op: Expr +) : NegExpr() { - private static final int HASH_SEED = 4622; - private static final String OPERATOR_LABEL = "fpneg"; + companion object { - private FpNegExpr(final Expr op) { - super(op); - } + private const val OPERATOR_LABEL = "fpneg" - public static FpNegExpr of(final Expr op) { - return new FpNegExpr(op); - } + @JvmStatic + fun of(op: Expr) = FpNegExpr(op) - public static FpNegExpr create(final Expr op) { - final Expr newOp = castFp(op); - return FpNegExpr.of(newOp); + @JvmStatic + fun create(op: Expr<*>) = FpNegExpr(castFp(op)) } - @Override - public FpType getType() { - return getOp().getType(); - } - - @Override - public FpLitExpr eval(final Valuation val) { - final FpLitExpr opVal = (FpLitExpr) getOp().eval(val); - return opVal.neg(); - } + override val type: FpType get() = op.type - @Override - public FpNegExpr with(final Expr op) { - if (op == getOp()) { - return this; - } else { - return FpNegExpr.of(op); - } - } + override fun eval(`val`: Valuation): FpLitExpr = + (op.eval(`val`) as FpLitExpr).neg() - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final FpNegExpr that = (FpNegExpr) obj; - return this.getOp().equals(that.getOp()); - } else { - return false; - } - } + override fun of(op: Expr): FpNegExpr = Companion.of(op) - @Override - protected int getHashSeed() { - return HASH_SEED; - } + override val operatorLabel: String get() = OPERATOR_LABEL - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } + override fun toString(): String = super.toString() } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpNeqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpNeqExpr.kt index a0cafbd3b1..df56fb2c25 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpNeqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpNeqExpr.kt @@ -13,90 +13,49 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.fptype; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.utils.TypeUtils.castFp; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; +package hu.bme.mit.theta.core.type.fptype -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.NeqExpr; -import hu.bme.mit.theta.core.type.booltype.BoolLitExpr; -import hu.bme.mit.theta.core.type.booltype.BoolType; +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.NeqExpr +import hu.bme.mit.theta.core.type.booltype.BoolLitExpr +import hu.bme.mit.theta.core.utils.TypeUtils.castFp +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -public final class FpNeqExpr extends NeqExpr { +@Serializable +@SerialName("FpNeq") +data class FpNeqExpr( + override val leftOp: Expr, + override val rightOp: Expr +) : NeqExpr() { - private static final int HASH_SEED = 7646; - private static final String OPERATOR_LABEL = "/="; - - private FpNeqExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - checkAllTypesEqual(leftOp, rightOp); - } - - public static FpNeqExpr of(final Expr leftOp, final Expr rightOp) { - return new FpNeqExpr(leftOp, rightOp); - } - - public static FpNeqExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = castFp(leftOp); - final Expr newRightOp = castFp(rightOp); - return FpNeqExpr.of(newLeftOp, newRightOp); + init { + checkAllTypesEqual(leftOp, rightOp) } - @Override - public BoolType getType() { - return Bool(); - } + companion object { - @Override - public BoolLitExpr eval(final Valuation val) { - final FpLitExpr leftOpVal = (FpLitExpr) getLeftOp().eval(val); - final FpLitExpr rightOpVal = (FpLitExpr) getRightOp().eval(val); + @JvmStatic + fun of(leftOp: Expr, rightOp: Expr) = + FpNeqExpr(leftOp, rightOp) - return leftOpVal.neq(rightOpVal); + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + FpNeqExpr(castFp(leftOp), castFp(rightOp)) } - @Override - public FpNeqExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return FpNeqExpr.of(leftOp, rightOp); - } + override fun eval(`val`: Valuation): BoolLitExpr { + val leftOpVal = leftOp.eval(`val`) as FpLitExpr + val rightOpVal = rightOp.eval(`val`) as FpLitExpr + return leftOpVal.neq(rightOpVal) } - @Override - public FpNeqExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } + override fun of(leftOp: Expr, rightOp: Expr): FpNeqExpr = + Companion.of(leftOp, rightOp) - @Override - public FpNeqExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final FpNeqExpr that = (FpNeqExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } - - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } + override fun toString(): String = super.toString() } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpPosExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpPosExpr.kt index 5252cfd7b2..f2e331b90b 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpPosExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpPosExpr.kt @@ -13,71 +13,40 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.fptype; -import static hu.bme.mit.theta.core.utils.TypeUtils.castFp; +package hu.bme.mit.theta.core.type.fptype -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.PosExpr; +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.PosExpr +import hu.bme.mit.theta.core.utils.TypeUtils.castFp +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -public final class FpPosExpr extends PosExpr { +@Serializable +@SerialName("FpPos") +data class FpPosExpr( + override val op: Expr +) : PosExpr() { + companion object { + private const val OPERATOR_LABEL = "fppos" - private static final int HASH_SEED = 9424; - private static final String OPERATOR_LABEL = "fppos"; + @JvmStatic + fun of(op: Expr) = FpPosExpr(op) - private FpPosExpr(final Expr op) { - super(op); + @JvmStatic + fun create(op: Expr<*>) = FpPosExpr(castFp(op)) } - public static FpPosExpr of(final Expr op) { - return new FpPosExpr(op); - } - - public static FpPosExpr create(final Expr op) { - final Expr newOp = castFp(op); - return FpPosExpr.of(newOp); - } - - @Override - public FpType getType() { - return getOp().getType(); - } - - @Override - public FpLitExpr eval(final Valuation val) { - final FpLitExpr opVal = (FpLitExpr) getOp().eval(val); - return opVal.pos(); - } + override val type: FpType get() = op.type - @Override - public FpPosExpr with(final Expr op) { - if (op == getOp()) { - return this; - } else { - return FpPosExpr.of(op); - } - } + override fun eval(`val`: Valuation): FpLitExpr = + (op.eval(`val`) as FpLitExpr).pos() - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final FpPosExpr that = (FpPosExpr) obj; - return this.getOp().equals(that.getOp()); - } else { - return false; - } - } + override fun of(op: Expr): FpPosExpr = Companion.of(op) - @Override - protected int getHashSeed() { - return HASH_SEED; - } + override val operatorLabel: String get() = OPERATOR_LABEL - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } + override fun toString(): String = super.toString() } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpRemExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpRemExpr.kt index d7c00578e2..470ca64b92 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpRemExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpRemExpr.kt @@ -13,94 +13,58 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.fptype; -import static hu.bme.mit.theta.core.utils.TypeUtils.castFp; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.BinaryExpr; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.utils.FpUtils; -import org.kframework.mpfr.BigFloat; - -public final class FpRemExpr extends BinaryExpr { - - private static final int HASH_SEED = 6670; - - private static final String OPERATOR_LABEL = "fprem"; - - private FpRemExpr(final Expr leftOp, final Expr rightOp) { - super(leftOp, rightOp); - checkAllTypesEqual(leftOp, rightOp); - } - - public static FpRemExpr of(final Expr leftOp, final Expr rightOp) { - return new FpRemExpr(leftOp, rightOp); - } - - public static FpRemExpr create(final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = castFp(leftOp); - final Expr newRightOp = castFp(rightOp); - return FpRemExpr.of(newLeftOp, newRightOp); +package hu.bme.mit.theta.core.type.fptype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.BinaryExpr +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.utils.FpUtils.* +import hu.bme.mit.theta.core.utils.TypeUtils.castFp +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("FpRem") +data class FpRemExpr( + override val leftOp: Expr, + override val rightOp: Expr +) : BinaryExpr() { + + init { + checkAllTypesEqual(leftOp, rightOp) } - @Override - public FpType getType() { - return getLeftOp().getType(); - } + companion object { - @Override - public FpLitExpr eval(final Valuation val) { - final FpLitExpr leftOpVal = (FpLitExpr) getLeftOp().eval(val); - final FpLitExpr rightOpVal = (FpLitExpr) getRightOp().eval(val); - BigFloat leftFloat = FpUtils.fpLitExprToBigFloat(null, leftOpVal); - BigFloat rightFloat = FpUtils.fpLitExprToBigFloat(null, rightOpVal); - BigFloat remainder = - leftFloat.remainder(rightFloat, FpUtils.getMathContext(this.getType(), null)); + private const val OPERATOR_LABEL = "fprem" - return FpUtils.bigFloatToFpLitExpr(remainder, this.getType()); - } + @JvmStatic + fun of(leftOp: Expr, rightOp: Expr) = + FpRemExpr(leftOp, rightOp) - @Override - public FpRemExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return FpRemExpr.of(leftOp, rightOp); - } + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + FpRemExpr(castFp(leftOp), castFp(rightOp)) } - @Override - public FpRemExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); - } + override val type: FpType get() = leftOp.type - @Override - public FpRemExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); + override fun eval(`val`: Valuation): FpLitExpr { + val leftOpVal = leftOp.eval(`val`) as FpLitExpr + val rightOpVal = rightOp.eval(`val`) as FpLitExpr + val leftFloat = fpLitExprToBigFloat(null, leftOpVal) + val rightFloat = fpLitExprToBigFloat(null, rightOpVal) + val remainder = leftFloat.remainder(rightFloat, getMathContext(this.type, null)) + return bigFloatToFpLitExpr(remainder, this.type) } - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final FpRemExpr that = (FpRemExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()); - } else { - return false; - } - } + override fun of(leftOp: Expr, rightOp: Expr): FpRemExpr = + Companion.of(leftOp, rightOp) - @Override - protected int getHashSeed() { - return HASH_SEED; - } + override val operatorLabel: String get() = OPERATOR_LABEL - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } + override fun toString(): String = super.toString() } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpRoundToIntegralExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpRoundToIntegralExpr.kt index 491c621864..b86d545871 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpRoundToIntegralExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpRoundToIntegralExpr.kt @@ -13,94 +13,60 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.fptype; -import static com.google.common.base.Preconditions.checkNotNull; -import static hu.bme.mit.theta.core.utils.TypeUtils.castFp; +package hu.bme.mit.theta.core.type.fptype -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.UnaryExpr; -import hu.bme.mit.theta.core.utils.FpUtils; -import java.math.BigInteger; -import org.kframework.mpfr.BigFloat; -import org.kframework.mpfr.BinaryMathContext; +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.UnaryExpr +import hu.bme.mit.theta.core.utils.FpUtils +import hu.bme.mit.theta.core.utils.TypeUtils.castFp +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import org.kframework.mpfr.BinaryMathContext -public class FpRoundToIntegralExpr extends UnaryExpr { // round to integral +@Serializable +@SerialName("FpRoundToIntegral") +data class FpRoundToIntegralExpr( + val roundingMode: FpRoundingMode, + override val op: Expr +) : UnaryExpr() { + companion object { + private const val OPERATOR_LABEL = "fproundtoint" - private static final int HASH_SEED = 6671; - private static final String OPERATOR_LABEL = "fproundtoint"; + @JvmStatic + fun of(roundingMode: FpRoundingMode, op: Expr) = + FpRoundToIntegralExpr(roundingMode, op) - private final FpRoundingMode roundingMode; - - private FpRoundToIntegralExpr(final FpRoundingMode roundingMode, final Expr op) { - super(op); - checkNotNull(roundingMode); - this.roundingMode = roundingMode; - } - - public static FpRoundToIntegralExpr of(final FpRoundingMode roundingMode, Expr op) { - return new FpRoundToIntegralExpr(roundingMode, op); - } - - public static FpRoundToIntegralExpr create(final FpRoundingMode roundingMode, Expr op) { - checkNotNull(op); - return FpRoundToIntegralExpr.of(roundingMode, castFp(op)); - } - - public FpRoundingMode getRoundingMode() { - return roundingMode; + @JvmStatic + fun create(roundingMode: FpRoundingMode, op: Expr<*>) = + FpRoundToIntegralExpr(roundingMode, castFp(op)) } - @Override - public FpType getType() { - return getOp().getType(); - } + override val type: FpType get() = op.type - @Override - public FpLitExpr eval(Valuation val) { - final FpLitExpr opVal = (FpLitExpr) getOp().eval(val); - BigFloat value = FpUtils.fpLitExprToBigFloat(roundingMode, opVal); - BigInteger bigInteger = value.toBigInteger(); - BigFloat round = - value.round( - new BinaryMathContext( - bigInteger.bitLength(), - opVal.getType().getExponent(), - FpUtils.getMathContextRoundingMode(roundingMode))); - round = round.round(FpUtils.getMathContext(getType(), roundingMode)); - FpLitExpr fpLitExpr = FpUtils.bigFloatToFpLitExpr(round, this.getType()); - return fpLitExpr; + override fun eval(`val`: Valuation): FpLitExpr { + val opVal = op.eval(`val`) as FpLitExpr + val value = FpUtils.fpLitExprToBigFloat(roundingMode, opVal) + val bigInteger = value.toBigInteger() + var round = + value.round( + BinaryMathContext( + bigInteger.bitLength(), + opVal.type.exponent, + FpUtils.getMathContextRoundingMode(roundingMode) + ) + ) + round = round.round(FpUtils.getMathContext(type, roundingMode)) + val fpLitExpr = FpUtils.bigFloatToFpLitExpr(round, this.type) + return fpLitExpr } - @Override - public FpRoundToIntegralExpr with(final Expr op) { - if (op == getOp()) { - return this; - } else { - return FpRoundToIntegralExpr.of(roundingMode, op); - } - } + override fun of(op: Expr): FpRoundToIntegralExpr = + Companion.of(roundingMode, op) - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final FpRoundToIntegralExpr that = (FpRoundToIntegralExpr) obj; - return this.getOp().equals(that.getOp()) && roundingMode.equals(that.roundingMode); - } else { - return false; - } - } + override val operatorLabel: String get() = OPERATOR_LABEL - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL + "[" + roundingMode.toString() + "]"; - } + override fun toString(): String = super.toString() } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpRoundingMode.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpRoundingMode.kt index fc0b568c1d..ca71f87363 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpRoundingMode.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpRoundingMode.kt @@ -13,16 +13,26 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.fptype; -public enum FpRoundingMode { - RNE, /* Round nearest ties to even */ - RNA, /* Round nearest ties to away */ - RTP, /* Round toward positive */ - RTN, /* Round toward negative */ - RTZ; /* Round toward zero */ +package hu.bme.mit.theta.core.type.fptype - public static FpRoundingMode getDefaultRoundingMode() { - return RNE; /* Default because it is default in the C standard */ +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("FpRoundingMode") +enum class FpRoundingMode { + + RNE, // Round nearest ties to even + RNA, // Round nearest ties to away + RTP, // Round toward positive + RTN, // Round toward negative + RTZ; // Round toward zero + + companion object { + + @JvmStatic + val defaultRoundingMode: FpRoundingMode = RNE } } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpSqrtExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpSqrtExpr.kt index 4deb866ccb..38d7fc3df6 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpSqrtExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpSqrtExpr.kt @@ -13,86 +13,52 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.fptype; -import static com.google.common.base.Preconditions.checkNotNull; -import static hu.bme.mit.theta.core.utils.TypeUtils.castFp; +package hu.bme.mit.theta.core.type.fptype -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.type.UnaryExpr; -import hu.bme.mit.theta.core.utils.FpUtils; -import org.kframework.mpfr.BigFloat; +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.type.UnaryExpr +import hu.bme.mit.theta.core.utils.FpUtils.* +import hu.bme.mit.theta.core.utils.TypeUtils.castFp +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -public class FpSqrtExpr extends UnaryExpr { +@Serializable +@SerialName("FpSqrt") +data class FpSqrtExpr( + val roundingMode: FpRoundingMode, + override val op: Expr +) : UnaryExpr() { - private static final int HASH_SEED = 6669; - private static final String OPERATOR_LABEL = "fpsqrt"; + companion object { - private final FpRoundingMode roundingMode; + private const val OPERATOR_LABEL = "fpsqrt" - private FpSqrtExpr(final FpRoundingMode roundingMode, final Expr op) { - super(op); - checkNotNull(roundingMode); - this.roundingMode = roundingMode; - } - - public static FpSqrtExpr of(final FpRoundingMode roundingMode, final Expr op) { - return new FpSqrtExpr(roundingMode, castFp(op)); - } - - public static FpSqrtExpr create(final FpRoundingMode roundingMode, final Expr op) { - checkNotNull(op); - return FpSqrtExpr.of(roundingMode, castFp(op)); - } - - public FpRoundingMode getRoundingMode() { - return roundingMode; - } + @JvmStatic + fun of(roundingMode: FpRoundingMode, op: Expr) = + FpSqrtExpr(roundingMode, op) - @Override - public FpType getType() { - return getOp().getType(); + @JvmStatic + fun create(roundingMode: FpRoundingMode, op: Expr<*>) = + FpSqrtExpr(roundingMode, castFp(op)) } - @Override - public LitExpr eval(Valuation val) { - final FpLitExpr opVal = (FpLitExpr) getOp().eval(val); - BigFloat sqrt = - FpUtils.fpLitExprToBigFloat(roundingMode, opVal) - .sqrt(FpUtils.getMathContext(getType(), roundingMode)); - return FpUtils.bigFloatToFpLitExpr(sqrt, getType()); - } + override val type: FpType get() = op.type - @Override - public UnaryExpr with(Expr op) { - if (op == getOp()) { - return this; - } else { - return FpSqrtExpr.of(roundingMode, op); - } + override fun eval(`val`: Valuation): LitExpr { + val opVal = op.eval(`val`) as FpLitExpr + val sqrt = fpLitExprToBigFloat(roundingMode, opVal) + .sqrt(getMathContext(type, roundingMode)) + return bigFloatToFpLitExpr(sqrt, type) } - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final FpSqrtExpr that = (FpSqrtExpr) obj; - return this.getOp().equals(that.getOp()) && roundingMode.equals(that.roundingMode); - } else { - return false; - } - } + override fun of(op: Expr): FpSqrtExpr = + Companion.of(roundingMode, op) - @Override - protected int getHashSeed() { - return HASH_SEED; - } + override val operatorLabel: String get() = OPERATOR_LABEL - @Override - public String getOperatorLabel() { - return OPERATOR_LABEL; - } + override fun toString(): String = super.toString() } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpSubExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpSubExpr.kt index 0109195ac7..2a619c6095 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpSubExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpSubExpr.kt @@ -13,102 +13,55 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.fptype; -import static hu.bme.mit.theta.core.utils.TypeUtils.castFp; -import static hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.SubExpr; - -public final class FpSubExpr extends SubExpr { - - private static final int HASH_SEED = 2498; - private static final String OPERATOR = "fpsub"; - - private final FpRoundingMode roundingMode; - - private FpSubExpr( - final FpRoundingMode roundingMode, - final Expr leftOp, - final Expr rightOp) { - super(leftOp, rightOp); - checkAllTypesEqual(leftOp, rightOp); - this.roundingMode = roundingMode; - } - - public static FpSubExpr of( - final FpRoundingMode roundingMode, - final Expr leftOp, - final Expr rightOp) { - return new FpSubExpr(roundingMode, leftOp, rightOp); - } - - public static FpSubExpr create( - final FpRoundingMode roundingMode, final Expr leftOp, final Expr rightOp) { - final Expr newLeftOp = castFp(leftOp); - final Expr newRightOp = castFp(rightOp); - return FpSubExpr.of(roundingMode, newLeftOp, newRightOp); +package hu.bme.mit.theta.core.type.fptype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.abstracttype.SubExpr +import hu.bme.mit.theta.core.utils.TypeUtils.castFp +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("FpSub") +data class FpSubExpr( + val roundingMode: FpRoundingMode, + override val leftOp: Expr, + override val rightOp: Expr +) : SubExpr() { + + init { + checkAllTypesEqual(leftOp, rightOp) } - public FpRoundingMode getRoundingMode() { - return roundingMode; - } + companion object { - @Override - public FpType getType() { - return getOps().get(0).getType(); - } + private const val OPERATOR_LABEL = "fpsub" - @Override - public FpLitExpr eval(final Valuation val) { - final FpLitExpr leftOpVal = (FpLitExpr) getLeftOp().eval(val); - final FpLitExpr rightOpVal = (FpLitExpr) getRightOp().eval(val); + @JvmStatic + fun of(roundingMode: FpRoundingMode, leftOp: Expr, rightOp: Expr) = + FpSubExpr(roundingMode, leftOp, rightOp) - return leftOpVal.sub(roundingMode, rightOpVal); + @JvmStatic + fun create(roundingMode: FpRoundingMode, leftOp: Expr<*>, rightOp: Expr<*>) = + FpSubExpr(roundingMode, castFp(leftOp), castFp(rightOp)) } - @Override - public FpSubExpr with(final Expr leftOp, final Expr rightOp) { - if (leftOp == getLeftOp() && rightOp == getRightOp()) { - return this; - } else { - return FpSubExpr.of(roundingMode, leftOp, rightOp); - } - } + override val type: FpType get() = leftOp.type - @Override - public FpSubExpr withLeftOp(final Expr leftOp) { - return with(leftOp, getRightOp()); + override fun eval(`val`: Valuation): FpLitExpr { + val leftOpVal = leftOp.eval(`val`) as FpLitExpr + val rightOpVal = rightOp.eval(`val`) as FpLitExpr + return leftOpVal.sub(roundingMode, rightOpVal) } - @Override - public FpSubExpr withRightOp(final Expr rightOp) { - return with(getLeftOp(), rightOp); - } + override fun of(leftOp: Expr, rightOp: Expr): FpSubExpr = + Companion.of(roundingMode, leftOp, rightOp) - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final FpSubExpr that = (FpSubExpr) obj; - return this.getLeftOp().equals(that.getLeftOp()) - && this.getRightOp().equals(that.getRightOp()) - && roundingMode == that.roundingMode; - } else { - return false; - } - } + override val operatorLabel: String get() = OPERATOR_LABEL - @Override - protected int getHashSeed() { - return HASH_SEED; - } - - @Override - public String getOperatorLabel() { - return OPERATOR; - } + override fun toString(): String = super.toString() } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpToBvExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpToBvExpr.kt index 2ff4baa121..2f38500b94 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpToBvExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpToBvExpr.kt @@ -13,128 +13,69 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.fptype; -import static com.google.common.base.Preconditions.checkNotNull; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.UnaryExpr; -import hu.bme.mit.theta.core.type.bvtype.BvLitExpr; -import hu.bme.mit.theta.core.type.bvtype.BvType; -import hu.bme.mit.theta.core.utils.BvUtils; -import hu.bme.mit.theta.core.utils.FpUtils; -import java.math.BigInteger; - -/** Sign and significand is presumed to be unsigned Exponent is presumed to be signed */ -public class FpToBvExpr extends UnaryExpr { - - private static final int HASH_SEED = 6796; - private static final String OPERATOR_LABEL = "fptobv"; - - private final Expr op; - private final int size; - private final boolean sgn; - - private final FpRoundingMode roundingMode; - - private FpToBvExpr( - final FpRoundingMode roundingMode, - final Expr op, - final int size, - final boolean sgn) { - super(op); - checkNotNull(op); - this.op = op; - - this.size = size; - this.sgn = sgn; - - checkNotNull(roundingMode); - this.roundingMode = roundingMode; - } - - public static FpToBvExpr of( - final FpRoundingMode roundingMode, - final Expr op, - final int size, - final boolean sgn) { - return new FpToBvExpr(roundingMode, op, size, sgn); - } - - public static FpToBvExpr create( - final FpRoundingMode roundingMode, - final Expr op, - final int size, - final boolean sgn) { - return FpToBvExpr.of(roundingMode, op, size, sgn); - } - - public int getSize() { - return size; - } - - public boolean getSgn() { - return sgn; +package hu.bme.mit.theta.core.type.fptype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.UnaryExpr +import hu.bme.mit.theta.core.type.bvtype.BvLitExpr +import hu.bme.mit.theta.core.type.bvtype.BvType +import hu.bme.mit.theta.core.utils.BvUtils.bigIntegerToSignedBvLitExpr +import hu.bme.mit.theta.core.utils.BvUtils.bigIntegerToUnsignedBvLitExpr +import hu.bme.mit.theta.core.utils.FpUtils.fpLitExprToBigFloat +import hu.bme.mit.theta.core.utils.TypeUtils.castFp +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("FpToBv") +data class FpToBvExpr( + val roundingMode: FpRoundingMode, + override val op: Expr, + val size: Int, + val sgn: Boolean +) : UnaryExpr() { + + companion object { + + private const val OPERATOR_LABEL = "fptobv" + + @JvmStatic + fun of(roundingMode: FpRoundingMode, op: Expr, size: Int, sgn: Boolean) = + FpToBvExpr(roundingMode, op, size, sgn) + + @JvmStatic + fun create(roundingMode: FpRoundingMode, op: Expr<*>, size: Int, sgn: Boolean) = + FpToBvExpr(roundingMode, castFp(op), size, sgn) } - @Override - public FpToBvExpr with(Expr op) { - if (op == getOp()) { - return this; - } else { - return FpToBvExpr.of(roundingMode, op, size, sgn); - } - } - - @Override - public BvType getType() { - return BvType.of(size); - } - - @Override - public BvLitExpr eval(Valuation val) { - final FpLitExpr op = (FpLitExpr) this.op.eval(val); - - BigInteger bigIntegerValue = FpUtils.fpLitExprToBigFloat(roundingMode, op).toBigInteger(); - if (sgn) { - return BvUtils.bigIntegerToSignedBvLitExpr(bigIntegerValue, size); - } else { - return BvUtils.bigIntegerToUnsignedBvLitExpr(bigIntegerValue, size); - } - } + override val type: BvType get() = BvType.of(size) - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final FpToBvExpr that = (FpToBvExpr) obj; - return this.getOp().equals(that.getOp()) - && size == that.size - && sgn == that.sgn - && roundingMode.equals(that.roundingMode); + override fun eval(`val`: Valuation): BvLitExpr { + val op = op.eval(`val`) as FpLitExpr + val bigIntegerValue = fpLitExprToBigFloat(roundingMode, op).toBigInteger() + return if (sgn) { + bigIntegerToSignedBvLitExpr(bigIntegerValue, size) } else { - return false; + bigIntegerToUnsignedBvLitExpr(bigIntegerValue, size) } } - protected int getHashSeed() { - return HASH_SEED; - } - - public FpRoundingMode getRoundingMode() { - return roundingMode; - } - - public String getOperatorLabel() { - return OPERATOR_LABEL - + "[" - + size - + "'" - + (sgn ? "s" : "u") - + "][" - + roundingMode.name() - + "]"; - } + override fun of(op: Expr): FpToBvExpr = + Companion.of(roundingMode, op, size, sgn) + + override val operatorLabel: String = + (OPERATOR_LABEL + + "[" + + "[" + + size + + "'" + + (if (sgn) "s" else "u") + + "][" + + roundingMode.name + + "]") + + override fun toString(): String = super.toString() } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpToFpExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpToFpExpr.kt index 1406cb86be..02c97bc39c 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpToFpExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpToFpExpr.kt @@ -13,113 +13,52 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.fptype; -import static com.google.common.base.Preconditions.checkNotNull; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.UnaryExpr; -import hu.bme.mit.theta.core.utils.FpUtils; -import org.kframework.mpfr.BigFloat; - -public class FpToFpExpr extends UnaryExpr { - - private static final int HASH_SEED = 6799; - private static final String OPERATOR_LABEL = "fptofp"; - - private final Expr op; - private final int expBits; - private final int signBits; - - private final FpRoundingMode roundingMode; - - private FpToFpExpr( - final FpRoundingMode roundingMode, - final Expr op, - final int expBits, - final int signBits) { - super(op); - checkNotNull(op); - this.op = op; - - this.signBits = signBits; - this.expBits = expBits; - - checkNotNull(roundingMode); - this.roundingMode = roundingMode; - } - - public static FpToFpExpr of( - final FpRoundingMode roundingMode, - final Expr op, - final int exp, - final int signBits) { - return new FpToFpExpr(roundingMode, op, exp, signBits); - } - - public static FpToFpExpr create( - final FpRoundingMode roundingMode, - final Expr op, - final int exp, - final int signBits) { - return FpToFpExpr.of(roundingMode, op, exp, signBits); - } - - public int getExpBits() { - return expBits; - } - - public int getSignBits() { - return signBits; +package hu.bme.mit.theta.core.type.fptype + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.UnaryExpr +import hu.bme.mit.theta.core.utils.FpUtils.bigFloatToFpLitExpr +import hu.bme.mit.theta.core.utils.FpUtils.fpLitExprToBigFloat +import hu.bme.mit.theta.core.utils.TypeUtils.castFp +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("FpToFp") +data class FpToFpExpr( + val roundingMode: FpRoundingMode, + override val op: Expr, + val expBits: Int, + val signBits: Int +) : UnaryExpr() { + companion object { + private const val OPERATOR_LABEL = "fptofp" + + @JvmStatic + fun of(roundingMode: FpRoundingMode, op: Expr, expBits: Int, signBits: Int) = + FpToFpExpr(roundingMode, op, expBits, signBits) + + @JvmStatic + fun create(roundingMode: FpRoundingMode, op: Expr<*>, expBits: Int, signBits: Int) = + FpToFpExpr(roundingMode, castFp(op), expBits, signBits) } - @Override - public FpToFpExpr with(Expr op) { - if (op == getOp()) { - return this; - } else { - return FpToFpExpr.of(roundingMode, op, expBits, signBits); - } - } + override val type: FpType get() = FpType(expBits, signBits) - @Override - public FpType getType() { - return FpType.of(expBits, signBits); + override fun eval(`val`: Valuation): FpLitExpr { + val op = op.eval(`val`) as FpLitExpr + val value = fpLitExprToBigFloat(roundingMode, op) + return bigFloatToFpLitExpr(value, type) } - @Override - public FpLitExpr eval(Valuation val) { - final FpLitExpr op = (FpLitExpr) this.op.eval(val); + override fun of(op: Expr): FpToFpExpr = + Companion.of(roundingMode, op, expBits, signBits) - BigFloat value = FpUtils.fpLitExprToBigFloat(roundingMode, op); - return FpUtils.bigFloatToFpLitExpr(value, getType()); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final FpToFpExpr that = (FpToFpExpr) obj; - return this.getOp().equals(that.getOp()) - && expBits == that.expBits - && signBits == that.signBits - && roundingMode.equals(that.roundingMode); - } else { - return false; - } - } + override val operatorLabel: String = + "$OPERATOR_LABEL[$expBits,$signBits]" - protected int getHashSeed() { - return HASH_SEED; - } - - public String getOperatorLabel() { - return OPERATOR_LABEL + "[" + expBits + "," + signBits + "]"; - } - - public FpRoundingMode getRoundingMode() { - return roundingMode; - } + override fun toString(): String = super.toString() } + diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpType.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpType.kt index 0095fa1bcd..a53edc0a7f 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpType.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpType.kt @@ -13,139 +13,61 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package hu.bme.mit.theta.core.type.fptype; -import static com.google.common.base.Preconditions.checkArgument; +package hu.bme.mit.theta.core.type.fptype -import hu.bme.mit.theta.common.Utils; -import hu.bme.mit.theta.core.type.DomainSize; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.abstracttype.*; -import java.math.BigInteger; +import hu.bme.mit.theta.common.Utils +import hu.bme.mit.theta.core.type.* +import hu.bme.mit.theta.core.type.abstracttype.* +import java.math.BigInteger +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable -public class FpType - implements Equational, Additive, Multiplicative, Ordered { +@Serializable +@SerialName(FpType.TYPE_LABEL) +data class FpType( + val exponent: Int, + val significand: Int +) : Equational, Additive, Multiplicative, Ordered { - private static final int HASH_SEED = 5424; - private static final String TYPE_LABEL = "Fp"; - - private final int exponent; - private final int significand; - - private volatile int hashCode = 0; - - private FpType(final int exponent, final int significand) { - checkArgument(exponent > 1); - checkArgument(significand > 1); - this.exponent = exponent; - this.significand = significand; - } - - public static FpType of(final int exponent, final int significand) { - return new FpType(exponent, significand); - } - - public int getExponent() { - return exponent; - } - - public int getSignificand() { - return significand; - } - - @Override - public EqExpr Eq(Expr leftOp, Expr rightOp) { - return FpEqExpr.of(leftOp, rightOp); - } - - @Override - public NeqExpr Neq(Expr leftOp, Expr rightOp) { - return FpNeqExpr.of(leftOp, rightOp); - } - - @Override - public int hashCode() { - int result = hashCode; - if (result == 0) { - result = HASH_SEED; - result = 31 * result + exponent; - result = 31 * result + significand; - hashCode = result; - } - return result; - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } else if (obj != null && this.getClass() == obj.getClass()) { - final FpType that = (FpType) obj; - return this.getExponent() == that.getExponent() - && this.getSignificand() == that.getSignificand(); - } else { - return false; - } - } - - @Override - public String toString() { - return Utils.lispStringBuilder(TYPE_LABEL).add(exponent).add(significand).toString(); - } - - @Override - public AddExpr Add(Iterable> ops) { - return FpExprs.Add(FpRoundingMode.getDefaultRoundingMode(), ops); - } - - @Override - public SubExpr Sub(Expr leftOp, Expr rightOp) { - return FpExprs.Sub(FpRoundingMode.getDefaultRoundingMode(), leftOp, rightOp); + init { + require(exponent > 1) { "Exponent must be greater than 1" } + require(significand > 1) { "Significand must be greater than 1" } } - @Override - public PosExpr Pos(Expr op) { - return FpExprs.Pos(op); - } + companion object { - @Override - public NegExpr Neg(Expr op) { - return FpExprs.Neg(op); - } + internal const val TYPE_LABEL = "Fp" - @Override - public MulExpr Mul(Iterable> ops) { - return FpExprs.Mul(FpRoundingMode.getDefaultRoundingMode(), ops); + @JvmStatic + fun of(exponent: Int, significand: Int): FpType = FpType(exponent, significand) } - @Override - public DivExpr Div(Expr leftOp, Expr rightOp) { - return FpExprs.Div(FpRoundingMode.getDefaultRoundingMode(), leftOp, rightOp); - } + override fun Eq(leftOp: Expr, rightOp: Expr): EqExpr = FpEqExpr(leftOp, rightOp) + override fun Neq(leftOp: Expr, rightOp: Expr): NeqExpr = FpNeqExpr(leftOp, rightOp) + override fun Add(ops: Iterable>): AddExpr = + FpExprs.Add(FpRoundingMode.defaultRoundingMode, ops) - @Override - public LtExpr Lt(Expr leftOp, Expr rightOp) { - return FpExprs.Lt(leftOp, rightOp); - } + override fun Sub(leftOp: Expr, rightOp: Expr): SubExpr = + FpExprs.Sub(FpRoundingMode.defaultRoundingMode, leftOp, rightOp) - @Override - public LeqExpr Leq(Expr leftOp, Expr rightOp) { - return FpExprs.Leq(leftOp, rightOp); - } + override fun Pos(op: Expr): PosExpr = FpExprs.Pos(op) + override fun Neg(op: Expr): NegExpr = FpExprs.Neg(op) + override fun Mul(ops: Iterable>): MulExpr = + FpExprs.Mul(FpRoundingMode.defaultRoundingMode, ops) - @Override - public GtExpr Gt(Expr leftOp, Expr rightOp) { - return FpExprs.Gt(leftOp, rightOp); - } + override fun Div(leftOp: Expr, rightOp: Expr): DivExpr = + FpExprs.Div(FpRoundingMode.defaultRoundingMode, leftOp, rightOp) - @Override - public GeqExpr Geq(Expr leftOp, Expr rightOp) { - return FpExprs.Geq(leftOp, rightOp); - } + override fun Lt(leftOp: Expr, rightOp: Expr): LtExpr = FpExprs.Lt(leftOp, rightOp) + override fun Leq(leftOp: Expr, rightOp: Expr): LeqExpr = FpExprs.Leq(leftOp, rightOp) + override fun Gt(leftOp: Expr, rightOp: Expr): GtExpr = FpExprs.Gt(leftOp, rightOp) + override fun Geq(leftOp: Expr, rightOp: Expr): GeqExpr = FpExprs.Geq(leftOp, rightOp) + override val domainSize: DomainSize + get() = DomainSize.of( + BigInteger.TWO.pow(significand).multiply(BigInteger.TWO.pow(exponent)) + ) - @Override - public DomainSize getDomainSize() { - return DomainSize.of( - BigInteger.TWO.pow(significand).multiply(BigInteger.TWO.pow(exponent))); - } + override fun toString(): String = Utils.lispStringBuilder(TYPE_LABEL).add(exponent).add(significand).toString() } + diff --git a/subprojects/common/grammar/src/main/java/hu/bme/mit/theta/grammar/dsl/expr/ExprParser.kt b/subprojects/common/grammar/src/main/java/hu/bme/mit/theta/grammar/dsl/expr/ExprParser.kt index 1f63f99b35..c6dc85f83b 100644 --- a/subprojects/common/grammar/src/main/java/hu/bme/mit/theta/grammar/dsl/expr/ExprParser.kt +++ b/subprojects/common/grammar/src/main/java/hu/bme/mit/theta/grammar/dsl/expr/ExprParser.kt @@ -736,7 +736,7 @@ class ExpressionWrapper(scope: Scope, content: String) { if (matcher.find()) { return FpRoundingMode.valueOf(matcher.group(1).uppercase()) } - return FpRoundingMode.getDefaultRoundingMode() + return FpRoundingMode.defaultRoundingMode } override fun visitBitwiseNotExpr(ctx: BitwiseNotExprContext): Expr { From ba98b056b1eaacce8854d01c3df0becf6cb5f548 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Csan=C3=A1d=20Telbisz?= Date: Tue, 24 Jun 2025 17:07:12 +0200 Subject: [PATCH 24/48] convert to serializable - fixes at call sites --- .../theta/cfa/analysis/CfaToMonolithicExpr.kt | 9 +- .../bme/mit/theta/cfa/dsl/CfaExpression.java | 127 +++++-------- .../java/hu/bme/mit/theta/cfa/CfaTest.java | 7 +- .../mit/theta/cfa/CFAVarChangerUnitTest.kt | 4 +- .../bounded/AbstractMonolithicExpr.kt | 2 +- .../algorithm/bounded/BoundedChecker.kt | 4 +- .../algorithm/bounded/MonolithicL2S.kt | 4 +- ...BoundedUnrollingASGTraceCheckerStrategy.kt | 4 +- .../util/VarCollectorStmtVisitor.kt | 6 +- .../analysis/algorithm/oc/IDLOcChecker.kt | 8 +- .../theta/analysis/algorithm/oc/OcChecker.kt | 4 +- .../bme/mit/theta/analysis/ptr/PtrAction.kt | 14 +- .../hu/bme/mit/theta/analysis/ptr/PtrUtils.kt | 10 +- .../mit/theta/analysis/algorithm/HornTest.kt | 4 +- .../utils/VarCollectorStmtVisitorTest.kt | 7 +- .../theta/analysis/multi/MultiAnalysisTest.kt | 44 ++--- .../java/hu/bme/mit/theta/core/ChcUtils.kt | 7 +- .../java/hu/bme/mit/theta/core/decl/Decls.kt | 4 + .../mit/theta/core/dsl/impl/ExprWriter.java | 4 +- .../hu/bme/mit/theta/core/stmt/AssumeStmt.kt | 2 +- .../hu/bme/mit/theta/core/stmt/SkipStmt.kt | 11 +- .../java/hu/bme/mit/theta/core/stmt/Stmts.kt | 2 + .../hu/bme/mit/theta/core/type/BinaryExpr.kt | 8 +- .../bme/mit/theta/core/type/MultiaryExpr.kt | 4 +- .../hu/bme/mit/theta/core/type/UnaryExpr.kt | 6 +- .../bme/mit/theta/core/type/anytype/Exprs.kt | 4 +- .../mit/theta/core/type/anytype/IteExpr.kt | 2 + .../mit/theta/core/type/anytype/PrimeExpr.kt | 2 +- .../theta/core/type/arraytype/ArrayEqExpr.kt | 4 +- .../theta/core/type/arraytype/ArrayExprs.kt | 2 + .../core/type/arraytype/ArrayInitExpr.kt | 2 +- .../theta/core/type/arraytype/ArrayNeqExpr.kt | 4 +- .../mit/theta/core/type/booltype/AndExpr.kt | 4 +- .../mit/theta/core/type/booltype/BoolExprs.kt | 28 +++ .../theta/core/type/booltype/BoolLitExpr.kt | 2 + .../mit/theta/core/type/booltype/BoolType.kt | 3 + .../mit/theta/core/type/booltype/IffExpr.kt | 2 +- .../mit/theta/core/type/booltype/ImplyExpr.kt | 2 +- .../mit/theta/core/type/booltype/NotExpr.kt | 2 +- .../mit/theta/core/type/booltype/OrExpr.kt | 4 +- .../core/type/booltype/SmartBoolExprs.kt | 8 + .../mit/theta/core/type/booltype/XorExpr.kt | 4 +- .../mit/theta/core/type/bvtype/BvAddExpr.kt | 2 +- .../mit/theta/core/type/bvtype/BvAndExpr.kt | 2 +- .../core/type/bvtype/BvArithShiftRightExpr.kt | 2 +- .../mit/theta/core/type/bvtype/BvEqExpr.kt | 2 +- .../bme/mit/theta/core/type/bvtype/BvExprs.kt | 10 +- .../core/type/bvtype/BvLogicShiftRightExpr.kt | 2 +- .../mit/theta/core/type/bvtype/BvMulExpr.kt | 2 +- .../mit/theta/core/type/bvtype/BvNegExpr.kt | 2 +- .../mit/theta/core/type/bvtype/BvNeqExpr.kt | 2 +- .../mit/theta/core/type/bvtype/BvNotExpr.kt | 2 +- .../mit/theta/core/type/bvtype/BvOrExpr.kt | 2 +- .../mit/theta/core/type/bvtype/BvPosExpr.kt | 2 +- .../core/type/bvtype/BvRotateLeftExpr.kt | 2 +- .../core/type/bvtype/BvRotateRightExpr.kt | 2 +- .../mit/theta/core/type/bvtype/BvSDivExpr.kt | 2 +- .../mit/theta/core/type/bvtype/BvSGeqExpr.kt | 2 +- .../mit/theta/core/type/bvtype/BvSGtExpr.kt | 2 +- .../mit/theta/core/type/bvtype/BvSLeqExpr.kt | 2 +- .../mit/theta/core/type/bvtype/BvSLtExpr.kt | 2 +- .../mit/theta/core/type/bvtype/BvSModExpr.kt | 2 +- .../mit/theta/core/type/bvtype/BvSRemExpr.kt | 2 +- .../theta/core/type/bvtype/BvShiftLeftExpr.kt | 2 +- .../core/type/bvtype/BvSignChangeExpr.kt | 2 +- .../mit/theta/core/type/bvtype/BvSubExpr.kt | 2 +- .../bme/mit/theta/core/type/bvtype/BvType.kt | 2 +- .../mit/theta/core/type/bvtype/BvUDivExpr.kt | 2 +- .../mit/theta/core/type/bvtype/BvUGeqExpr.kt | 2 +- .../mit/theta/core/type/bvtype/BvUGtExpr.kt | 2 +- .../mit/theta/core/type/bvtype/BvULeqExpr.kt | 2 +- .../mit/theta/core/type/bvtype/BvULtExpr.kt | 2 +- .../mit/theta/core/type/bvtype/BvURemExpr.kt | 2 +- .../mit/theta/core/type/bvtype/BvXorExpr.kt | 2 +- .../theta/core/type/enumtype/EnumEqExpr.kt | 4 +- .../theta/core/type/enumtype/EnumNeqExpr.kt | 4 +- .../mit/theta/core/type/fptype/FpAbsExpr.kt | 2 +- .../mit/theta/core/type/fptype/FpAddExpr.kt | 2 +- .../theta/core/type/fptype/FpAssignExpr.kt | 4 +- .../mit/theta/core/type/fptype/FpDivExpr.kt | 4 +- .../mit/theta/core/type/fptype/FpEqExpr.kt | 4 +- .../theta/core/type/fptype/FpFromBvExpr.kt | 6 +- .../mit/theta/core/type/fptype/FpGeqExpr.kt | 4 +- .../mit/theta/core/type/fptype/FpGtExpr.kt | 4 +- .../core/type/fptype/FpIsInfiniteExpr.kt | 2 +- .../mit/theta/core/type/fptype/FpIsNanExpr.kt | 2 +- .../mit/theta/core/type/fptype/FpLeqExpr.kt | 4 +- .../mit/theta/core/type/fptype/FpLitExpr.kt | 2 +- .../mit/theta/core/type/fptype/FpLtExpr.kt | 4 +- .../mit/theta/core/type/fptype/FpMaxExpr.kt | 4 +- .../mit/theta/core/type/fptype/FpMinExpr.kt | 4 +- .../mit/theta/core/type/fptype/FpMulExpr.kt | 2 +- .../mit/theta/core/type/fptype/FpNegExpr.kt | 2 +- .../mit/theta/core/type/fptype/FpNeqExpr.kt | 4 +- .../mit/theta/core/type/fptype/FpPosExpr.kt | 2 +- .../mit/theta/core/type/fptype/FpRemExpr.kt | 4 +- .../core/type/fptype/FpRoundToIntegralExpr.kt | 4 +- .../mit/theta/core/type/fptype/FpSqrtExpr.kt | 4 +- .../mit/theta/core/type/fptype/FpSubExpr.kt | 4 +- .../mit/theta/core/type/fptype/FpToBvExpr.kt | 4 +- .../mit/theta/core/type/fptype/FpToFpExpr.kt | 4 +- .../mit/theta/core/type/inttype/IntAddExpr.kt | 4 +- .../mit/theta/core/type/inttype/IntDivExpr.kt | 4 +- .../mit/theta/core/type/inttype/IntEqExpr.kt | 4 +- .../mit/theta/core/type/inttype/IntGeqExpr.kt | 4 +- .../mit/theta/core/type/inttype/IntGtExpr.kt | 4 +- .../mit/theta/core/type/inttype/IntLeqExpr.kt | 4 +- .../mit/theta/core/type/inttype/IntLtExpr.kt | 4 +- .../mit/theta/core/type/inttype/IntModExpr.kt | 4 +- .../mit/theta/core/type/inttype/IntMulExpr.kt | 4 +- .../mit/theta/core/type/inttype/IntNegExpr.kt | 2 +- .../mit/theta/core/type/inttype/IntNeqExpr.kt | 4 +- .../mit/theta/core/type/inttype/IntPosExpr.kt | 2 +- .../mit/theta/core/type/inttype/IntRemExpr.kt | 4 +- .../mit/theta/core/type/inttype/IntSubExpr.kt | 4 +- .../theta/core/type/inttype/IntToRatExpr.kt | 2 +- .../mit/theta/core/type/inttype/IntType.kt | 3 + .../mit/theta/core/type/rattype/RatAddExpr.kt | 2 +- .../mit/theta/core/type/rattype/RatDivExpr.kt | 4 +- .../mit/theta/core/type/rattype/RatEqExpr.kt | 4 +- .../mit/theta/core/type/rattype/RatGeqExpr.kt | 4 +- .../mit/theta/core/type/rattype/RatGtExpr.kt | 4 +- .../mit/theta/core/type/rattype/RatLeqExpr.kt | 4 +- .../mit/theta/core/type/rattype/RatLtExpr.kt | 4 +- .../mit/theta/core/type/rattype/RatMulExpr.kt | 4 +- .../mit/theta/core/type/rattype/RatNegExpr.kt | 2 +- .../mit/theta/core/type/rattype/RatNeqExpr.kt | 4 +- .../mit/theta/core/type/rattype/RatPosExpr.kt | 2 +- .../mit/theta/core/type/rattype/RatSubExpr.kt | 4 +- .../theta/core/type/rattype/RatToIntExpr.kt | 2 +- .../mit/theta/core/utils/ExprSimplifier.java | 12 +- .../core/utils/StmtToExprTransformerTest.java | 4 +- .../mit/theta/core/utils/ArrayTestUtils.java | 23 +-- .../mit/theta/grammar/dsl/expr/ExprParser.kt | 121 +++++++------ .../cfa/buchi/hoa/APGeneratorVisitor.kt | 2 +- .../grammar/expression/ExpressionVisitor.java | 2 +- .../model/types/complex/CComplexType.java | 10 +- .../pattern2expr/Pattern2ExprCompiler.kt | 63 ++++--- .../javasmt/JavaSMTExprTransformer.java | 170 +++--------------- .../generic/GenericSmtLibExprTransformer.java | 135 ++------------ .../generic/GenericSmtLibTermTransformer.java | 140 +++------------ .../solver/z3legacy/Z3ExprTransformer.java | 17 +- .../solver/z3legacy/Z3TermTransformer.java | 4 +- .../theta/solver/z3/Z3ExprTransformer.java | 19 +- .../theta/solver/z3/Z3TermTransformer.java | 64 +++---- .../mit/theta/c2xcfa/FrontendXcfaBuilder.kt | 74 ++++---- .../hu/bme/mit/theta/llvm2xcfa/Utils.java | 26 ++- .../xcfa/analysis/XcfaToMonolithicExpr.kt | 12 +- .../theta/xcfa/analysis/oc/XcfaOcChecker.kt | 14 +- .../mit/theta/xcfa/analysis/oc/XcfaOcTypes.kt | 2 +- .../theta/xcfa/analysis/por/XcfaSporLts.kt | 4 +- .../main/java/hu/bme/mit/theta/xcfa/Utils.kt | 4 +- .../java/hu/bme/mit/theta/xcfa/XcfaToC.kt | 2 +- .../java/hu/bme/mit/theta/xcfa/model/Dsl.kt | 4 +- .../hu/bme/mit/theta/xcfa/model/XcfaLabel.kt | 2 +- .../xcfa/passes/FpFunctionsToExprsPass.kt | 28 +-- .../mit/theta/xcfa/passes/MemsafetyPass.kt | 5 +- .../mit/theta/xcfa/passes/MutexToVarPass.kt | 9 +- .../theta/xsts/analysis/util/RandomXsts.kt | 24 +-- .../xsts/analysis/util/XstsSerializer.kt | 12 +- .../mit/theta/xsts/dsl/XstsExpression.java | 39 ++-- 161 files changed, 705 insertions(+), 994 deletions(-) diff --git a/subprojects/cfa/cfa-analysis/src/main/kotlin/hu/bme/mit/theta/cfa/analysis/CfaToMonolithicExpr.kt b/subprojects/cfa/cfa-analysis/src/main/kotlin/hu/bme/mit/theta/cfa/analysis/CfaToMonolithicExpr.kt index 74e15224fe..c7593b2304 100644 --- a/subprojects/cfa/cfa-analysis/src/main/kotlin/hu/bme/mit/theta/cfa/analysis/CfaToMonolithicExpr.kt +++ b/subprojects/cfa/cfa-analysis/src/main/kotlin/hu/bme/mit/theta/cfa/analysis/CfaToMonolithicExpr.kt @@ -21,7 +21,10 @@ import hu.bme.mit.theta.analysis.expl.ExplState import hu.bme.mit.theta.cfa.CFA import hu.bme.mit.theta.core.decl.Decls import hu.bme.mit.theta.core.model.Valuation -import hu.bme.mit.theta.core.stmt.* +import hu.bme.mit.theta.core.stmt.AssignStmt +import hu.bme.mit.theta.core.stmt.AssumeStmt +import hu.bme.mit.theta.core.stmt.NonDetStmt +import hu.bme.mit.theta.core.stmt.SequenceStmt import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Eq import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Neq @@ -29,7 +32,8 @@ import hu.bme.mit.theta.core.type.booltype.BoolExprs.And import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool import hu.bme.mit.theta.core.type.booltype.BoolType import hu.bme.mit.theta.core.type.bvtype.BvType -import hu.bme.mit.theta.core.type.fptype.FpExprs.* +import hu.bme.mit.theta.core.type.fptype.FpExprs.FpAssign +import hu.bme.mit.theta.core.type.fptype.FpExprs.NaN import hu.bme.mit.theta.core.type.fptype.FpType import hu.bme.mit.theta.core.type.inttype.IntExprs.Int import hu.bme.mit.theta.core.type.inttype.IntLitExpr @@ -38,7 +42,6 @@ import hu.bme.mit.theta.core.utils.BvUtils import hu.bme.mit.theta.core.utils.StmtUtils import hu.bme.mit.theta.core.utils.indexings.VarIndexingFactory import java.math.BigInteger -import java.util.* fun CFA.toMonolithicExpr(): MonolithicExpr { Preconditions.checkArgument(this.errorLoc.isPresent) diff --git a/subprojects/cfa/cfa/src/main/java/hu/bme/mit/theta/cfa/dsl/CfaExpression.java b/subprojects/cfa/cfa/src/main/java/hu/bme/mit/theta/cfa/dsl/CfaExpression.java index cac8b45802..5d36ef998a 100644 --- a/subprojects/cfa/cfa/src/main/java/hu/bme/mit/theta/cfa/dsl/CfaExpression.java +++ b/subprojects/cfa/cfa/src/main/java/hu/bme/mit/theta/cfa/dsl/CfaExpression.java @@ -15,68 +15,8 @@ */ package hu.bme.mit.theta.cfa.dsl; -import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.base.Preconditions.checkNotNull; -import static com.google.common.base.Preconditions.checkState; -import static hu.bme.mit.theta.cfa.dsl.gen.CfaDslParser.*; -import static hu.bme.mit.theta.common.Utils.head; -import static hu.bme.mit.theta.common.Utils.singleElementOf; -import static hu.bme.mit.theta.common.Utils.tail; -import static hu.bme.mit.theta.core.decl.Decls.Param; -import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Add; -import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Div; -import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Eq; -import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Geq; -import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Gt; -import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Ite; -import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Leq; -import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Lt; -import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Mod; -import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Mul; -import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Neg; -import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Neq; -import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Pos; -import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Rem; -import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Sub; -import static hu.bme.mit.theta.core.type.anytype.Exprs.Prime; -import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.ArrayInit; -import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.Read; -import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.Write; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.And; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Exists; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.False; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Forall; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Iff; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Imply; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Not; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Or; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.True; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Xor; -import static hu.bme.mit.theta.core.type.bvtype.BvExprs.Bv; -import static hu.bme.mit.theta.core.type.bvtype.BvExprs.Extract; -import static hu.bme.mit.theta.core.type.bvtype.BvExprs.SExt; -import static hu.bme.mit.theta.core.type.bvtype.BvExprs.ZExt; -import static hu.bme.mit.theta.core.type.fptype.FpExprs.Abs; -import static hu.bme.mit.theta.core.type.fptype.FpExprs.FromBv; -import static hu.bme.mit.theta.core.type.fptype.FpExprs.IsNan; -import static hu.bme.mit.theta.core.type.fptype.FpExprs.Max; -import static hu.bme.mit.theta.core.type.fptype.FpExprs.Min; -import static hu.bme.mit.theta.core.type.fptype.FpExprs.RoundToIntegral; -import static hu.bme.mit.theta.core.type.fptype.FpExprs.Sqrt; -import static hu.bme.mit.theta.core.type.fptype.FpExprs.ToBv; -import static hu.bme.mit.theta.core.type.fptype.FpExprs.ToFp; -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; -import static hu.bme.mit.theta.core.type.rattype.RatExprs.Rat; -import static hu.bme.mit.theta.core.utils.ExprUtils.simplify; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; -import static hu.bme.mit.theta.core.utils.TypeUtils.castBv; -import static hu.bme.mit.theta.core.utils.TypeUtils.castFp; -import static java.util.stream.Collectors.toList; - import com.google.common.collect.ImmutableList; import hu.bme.mit.theta.cfa.dsl.gen.CfaDslBaseVisitor; -import hu.bme.mit.theta.common.Tuple2; import hu.bme.mit.theta.common.dsl.BasicScope; import hu.bme.mit.theta.common.dsl.Env; import hu.bme.mit.theta.common.dsl.Scope; @@ -87,29 +27,13 @@ import hu.bme.mit.theta.core.dsl.ParseException; import hu.bme.mit.theta.core.type.Expr; import hu.bme.mit.theta.core.type.Type; -import hu.bme.mit.theta.core.type.abstracttype.AddExpr; -import hu.bme.mit.theta.core.type.abstracttype.DivExpr; -import hu.bme.mit.theta.core.type.abstracttype.ModExpr; -import hu.bme.mit.theta.core.type.abstracttype.MulExpr; -import hu.bme.mit.theta.core.type.abstracttype.RemExpr; -import hu.bme.mit.theta.core.type.abstracttype.SubExpr; +import hu.bme.mit.theta.core.type.abstracttype.*; import hu.bme.mit.theta.core.type.anytype.RefExpr; import hu.bme.mit.theta.core.type.arraytype.ArrayType; import hu.bme.mit.theta.core.type.booltype.BoolType; import hu.bme.mit.theta.core.type.booltype.FalseExpr; import hu.bme.mit.theta.core.type.booltype.TrueExpr; -import hu.bme.mit.theta.core.type.bvtype.BvAddExpr; -import hu.bme.mit.theta.core.type.bvtype.BvConcatExpr; -import hu.bme.mit.theta.core.type.bvtype.BvExprs; -import hu.bme.mit.theta.core.type.bvtype.BvLitExpr; -import hu.bme.mit.theta.core.type.bvtype.BvMulExpr; -import hu.bme.mit.theta.core.type.bvtype.BvSDivExpr; -import hu.bme.mit.theta.core.type.bvtype.BvSModExpr; -import hu.bme.mit.theta.core.type.bvtype.BvSRemExpr; -import hu.bme.mit.theta.core.type.bvtype.BvSubExpr; -import hu.bme.mit.theta.core.type.bvtype.BvType; -import hu.bme.mit.theta.core.type.bvtype.BvUDivExpr; -import hu.bme.mit.theta.core.type.bvtype.BvURemExpr; +import hu.bme.mit.theta.core.type.bvtype.*; import hu.bme.mit.theta.core.type.fptype.FpExprs; import hu.bme.mit.theta.core.type.fptype.FpLitExpr; import hu.bme.mit.theta.core.type.fptype.FpRoundingMode; @@ -117,18 +41,49 @@ import hu.bme.mit.theta.core.type.functype.FuncExprs; import hu.bme.mit.theta.core.type.inttype.IntLitExpr; import hu.bme.mit.theta.core.type.rattype.RatLitExpr; +import kotlin.Pair; +import org.antlr.v4.runtime.Token; + import java.math.BigInteger; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.List; -import java.util.Optional; +import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; import java.util.stream.IntStream; import java.util.stream.Stream; -import org.antlr.v4.runtime.Token; + +import static com.google.common.base.Preconditions.*; +import static hu.bme.mit.theta.cfa.dsl.gen.CfaDslParser.*; +import static hu.bme.mit.theta.common.Utils.*; +import static hu.bme.mit.theta.core.decl.Decls.Param; +import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.*; +import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Add; +import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Div; +import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Eq; +import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Geq; +import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Gt; +import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Leq; +import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Lt; +import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Mul; +import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Neg; +import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Neq; +import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Pos; +import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Rem; +import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Sub; +import static hu.bme.mit.theta.core.type.anytype.Exprs.Prime; +import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.*; +import static hu.bme.mit.theta.core.type.booltype.BoolExprs.*; +import static hu.bme.mit.theta.core.type.booltype.BoolExprs.And; +import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Not; +import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Or; +import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Xor; +import static hu.bme.mit.theta.core.type.bvtype.BvExprs.*; +import static hu.bme.mit.theta.core.type.fptype.FpExprs.*; +import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; +import static hu.bme.mit.theta.core.type.rattype.RatExprs.Rat; +import static hu.bme.mit.theta.core.utils.ExprUtils.simplify; +import static hu.bme.mit.theta.core.utils.TypeUtils.*; +import static java.util.stream.Collectors.toList; final class CfaExpression { @@ -1105,11 +1060,11 @@ private Expr createArrayLitExpr( } valueType = (T2) ctx.elseExpr.accept(this).getType(); - final List, Expr>> elems = + final List, Expr>> elems = IntStream.range(0, ctx.indexExpr.size()) .mapToObj( i -> - Tuple2.of( + new Pair<>( cast( ctx.indexExpr.get(i).accept(this), indexType), diff --git a/subprojects/cfa/cfa/src/test/java/hu/bme/mit/theta/cfa/CfaTest.java b/subprojects/cfa/cfa/src/test/java/hu/bme/mit/theta/cfa/CfaTest.java index 41d0937af9..00cd0a437b 100644 --- a/subprojects/cfa/cfa/src/test/java/hu/bme/mit/theta/cfa/CfaTest.java +++ b/subprojects/cfa/cfa/src/test/java/hu/bme/mit/theta/cfa/CfaTest.java @@ -22,6 +22,8 @@ import hu.bme.mit.theta.core.type.inttype.IntType; import org.junit.Test; +import static org.junit.Assert.assertEquals; + public class CfaTest { @Test(expected = IllegalArgumentException.class) @@ -32,7 +34,7 @@ public void testDuplicateLocationName() { builder.createLoc("A"); } - @Test(expected = IllegalArgumentException.class) + @Test public void testDuplicateVarName() { CFA.Builder builder = CFA.builder(); VarDecl v1 = Decls.Var("x", IntExprs.Int()); @@ -43,6 +45,7 @@ public void testDuplicateVarName() { builder.createEdge(init, loc1, Stmts.Havoc(v1)); builder.createEdge(init, loc2, Stmts.Havoc(v2)); builder.setInitLoc(init); - builder.build(); + CFA cfa = builder.build(); + assertEquals(1, cfa.getVars().size()); } } diff --git a/subprojects/cfa/cfa/src/test/kotlin/hu/bme/mit/theta/cfa/CFAVarChangerUnitTest.kt b/subprojects/cfa/cfa/src/test/kotlin/hu/bme/mit/theta/cfa/CFAVarChangerUnitTest.kt index 7ba89089f1..e4f4848791 100644 --- a/subprojects/cfa/cfa/src/test/kotlin/hu/bme/mit/theta/cfa/CFAVarChangerUnitTest.kt +++ b/subprojects/cfa/cfa/src/test/kotlin/hu/bme/mit/theta/cfa/CFAVarChangerUnitTest.kt @@ -32,7 +32,7 @@ class CFAVarChangerUnitTest { val newVar = Decls.Var("x", IntType.getInstance()) val newCfa = origCfa.copyWithReplacingVars(listOf(newVar).associateBy { it.name }) - assert(!newCfa.vars.any { origCfa.vars.contains(it) }) - assert(origCfa.vars.iterator().next() != newCfa.vars.iterator().next()) + assert(!newCfa.vars.any { new -> origCfa.vars.any { old -> new === old } }) + assert(origCfa.vars.first() !== newCfa.vars.first()) } } diff --git a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/bounded/AbstractMonolithicExpr.kt b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/bounded/AbstractMonolithicExpr.kt index fa3a37345c..e7feb230fe 100644 --- a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/bounded/AbstractMonolithicExpr.kt +++ b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/bounded/AbstractMonolithicExpr.kt @@ -100,7 +100,7 @@ fun MonolithicExpr.createAbstract(prec: PredPrec): MonolithicExpr { .map { when ((it.value as BoolLitExpr).value) { true -> literalToPred[it.key] - false -> Not(literalToPred[it.key]) + false -> Not(literalToPred[it.key]!!) } } .toList() diff --git a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/bounded/BoundedChecker.kt b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/bounded/BoundedChecker.kt index d977c0fba5..341cb7fa07 100644 --- a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/bounded/BoundedChecker.kt +++ b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/bounded/BoundedChecker.kt @@ -26,7 +26,9 @@ import hu.bme.mit.theta.common.logging.Logger import hu.bme.mit.theta.core.model.Valuation import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Eq -import hu.bme.mit.theta.core.type.booltype.BoolExprs.* +import hu.bme.mit.theta.core.type.booltype.BoolExprs.And +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Not +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Or import hu.bme.mit.theta.core.type.booltype.BoolType import hu.bme.mit.theta.core.utils.PathUtils import hu.bme.mit.theta.core.utils.indexings.VarIndexing diff --git a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/bounded/MonolithicL2S.kt b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/bounded/MonolithicL2S.kt index e1f5b5f70b..0d87c19184 100644 --- a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/bounded/MonolithicL2S.kt +++ b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/bounded/MonolithicL2S.kt @@ -33,7 +33,7 @@ import hu.bme.mit.theta.core.utils.indexings.VarIndexingFactory import java.util.* private val reprEq = { e1: Expr<*>, e2: Expr<*> -> - if (e1.getType() is FpType) FpExprs.FpAssign(e1 as Expr, e2 as Expr) + if (e1.type is FpType) FpExprs.FpAssign(e1 as Expr, e2 as Expr) else Eq(e1, e2) } @@ -70,7 +70,7 @@ fun MonolithicExpr.createMonolithicL2S(): MonolithicExpr { newTransExpr.add(skipOrSave) // New prop expr - var prop: Expr? = saved.ref + var prop: Expr = saved.ref for ((key, value) in saveMap) { val exp = reprEq(value.ref, key.ref) prop = And(exp, prop) diff --git a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/loopchecker/refinement/BoundedUnrollingASGTraceCheckerStrategy.kt b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/loopchecker/refinement/BoundedUnrollingASGTraceCheckerStrategy.kt index abb31864f7..0908ed7ce6 100644 --- a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/loopchecker/refinement/BoundedUnrollingASGTraceCheckerStrategy.kt +++ b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/loopchecker/refinement/BoundedUnrollingASGTraceCheckerStrategy.kt @@ -122,8 +122,8 @@ class BoundedUnrollingASGTraceCheckerStrategy( .map { state -> val filtVars = usedVariablesPrecision.vars.filter(ExprUtils.getVars(state.toExpr())::contains) - val types = filtVars.map(VarDecl<*>::getType) - val sizes = types.map(Type::getDomainSize) + val types = filtVars.map(VarDecl<*>::type) + val sizes = types.map(Type::domainSize) val res = sizes.fold(DomainSize.ONE, DomainSize::multiply) res } diff --git a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/loopchecker/util/VarCollectorStmtVisitor.kt b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/loopchecker/util/VarCollectorStmtVisitor.kt index 45d7da0847..d021149b78 100644 --- a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/loopchecker/util/VarCollectorStmtVisitor.kt +++ b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/loopchecker/util/VarCollectorStmtVisitor.kt @@ -70,9 +70,9 @@ class VarCollectorStmtVisitor : StmtVisitor>, Set>> { override fun visit(stmt: IfStmt, param: Set>) = param + stmt.then.accept(this, param) + stmt.elze.accept(this, param) - override fun visit( - stmt: MemoryAssignStmt?, - param: Set>?, + override fun visit( + stmt: MemoryAssignStmt, + param: Set>, ): Set> { TODO("Not yet implemented") } diff --git a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/oc/IDLOcChecker.kt b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/oc/IDLOcChecker.kt index dc337c6fd6..b199e96f10 100644 --- a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/oc/IDLOcChecker.kt +++ b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/oc/IDLOcChecker.kt @@ -19,10 +19,14 @@ import hu.bme.mit.theta.core.decl.ConstDecl import hu.bme.mit.theta.core.decl.Decls import hu.bme.mit.theta.core.decl.VarDecl import hu.bme.mit.theta.core.type.Expr -import hu.bme.mit.theta.core.type.booltype.BoolExprs.* +import hu.bme.mit.theta.core.type.booltype.BoolExprs.And +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Imply import hu.bme.mit.theta.core.type.booltype.BoolLitExpr import hu.bme.mit.theta.core.type.booltype.BoolType -import hu.bme.mit.theta.core.type.inttype.IntExprs.* +import hu.bme.mit.theta.core.type.inttype.IntExprs.Int +import hu.bme.mit.theta.core.type.inttype.IntExprs.Lt +import hu.bme.mit.theta.core.type.inttype.IntExprs.Neq import hu.bme.mit.theta.core.type.inttype.IntLitExpr import hu.bme.mit.theta.core.type.inttype.IntType import hu.bme.mit.theta.solver.Solver diff --git a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/oc/OcChecker.kt b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/oc/OcChecker.kt index 0dbd6db6c5..d4a422c06a 100644 --- a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/oc/OcChecker.kt +++ b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/oc/OcChecker.kt @@ -16,7 +16,9 @@ package hu.bme.mit.theta.analysis.algorithm.oc import hu.bme.mit.theta.core.decl.VarDecl -import hu.bme.mit.theta.core.type.booltype.BoolExprs.* +import hu.bme.mit.theta.core.type.booltype.BoolExprs.And +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Imply +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Or import hu.bme.mit.theta.solver.Solver import hu.bme.mit.theta.solver.SolverStatus diff --git a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/ptr/PtrAction.kt b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/ptr/PtrAction.kt index e52a55e086..3e8dc33d4b 100644 --- a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/ptr/PtrAction.kt +++ b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/ptr/PtrAction.kt @@ -15,7 +15,6 @@ */ package hu.bme.mit.theta.analysis.ptr -import com.google.common.base.Preconditions import hu.bme.mit.theta.analysis.expr.StmtAction import hu.bme.mit.theta.core.decl.Decls.Var import hu.bme.mit.theta.core.decl.VarDecl @@ -64,26 +63,25 @@ abstract class PtrAction(writeTriples: WriteTriples = emptyMap(), val inCnt: Int val postList = ArrayList() for ((deref, type) in stmt.dereferencesWithAccessTypes) { - Preconditions.checkState( - deref.uniquenessIdx.isPresent, - "Incomplete dereferences (missing uniquenessIdx) are not handled properly.", - ) + requireNotNull(deref.uniquenessIdx) { + "Incomplete dereferences (missing uniquenessIdx) are not handled properly." + } val expr = deref.getIte(nextWriteTriples) if (type == AccessType.WRITE) { val writeExpr = ExprUtils.simplify(IntExprs.Add(expr, IntExprs.Int(1))) nextWriteTriples .getOrPut(deref.type) { ArrayList() } - .add(Triple(lookup[deref]!!.first, lookup[deref]!!.second, deref.uniquenessIdx.get())) + .add(Triple(lookup[deref]!!.first, lookup[deref]!!.second, deref.uniquenessIdx!!)) postList.add( Stmts.Assume( ExprUtils.simplify( - BoolExprs.And(listOf(AbstractExprs.Eq(writeExpr, deref.uniquenessIdx.get()))) + BoolExprs.And(listOf(AbstractExprs.Eq(writeExpr, deref.uniquenessIdx!!))) ) ) ) } else { preList.add( - Stmts.Assume(ExprUtils.simplify(AbstractExprs.Eq(expr, deref.uniquenessIdx.get()))) + Stmts.Assume(ExprUtils.simplify(AbstractExprs.Eq(expr, deref.uniquenessIdx!!))) ) } // postList.add(Stmts.Assume(Eq(vargen("value", deref.type).ref, deref))) // diff --git a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/ptr/PtrUtils.kt b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/ptr/PtrUtils.kt index a674f4e389..133c8535ef 100644 --- a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/ptr/PtrUtils.kt +++ b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/ptr/PtrUtils.kt @@ -15,7 +15,6 @@ */ package hu.bme.mit.theta.analysis.ptr -import com.google.common.base.Preconditions import hu.bme.mit.theta.analysis.Prec import hu.bme.mit.theta.analysis.expl.ExplPrec import hu.bme.mit.theta.analysis.expl.ExplState @@ -113,7 +112,7 @@ fun Stmt.uniqueDereferences( is AssumeStmt -> AssumeStmt.of(cond.uniqueDereferences(vargen, lookup).also { ret.addAll(it.first) }.second) - is SequenceStmt -> Stmts.SequenceStmt(stmts.map { it.uniqueDereferences(vargen, lookup) }) + is SequenceStmt -> Stmts.Sequence(stmts.map { it.uniqueDereferences(vargen, lookup) }) is HavocStmt<*> -> this is SkipStmt -> this is NonDetStmt -> error("NonDetStmts do not have a clearly defined sequence") @@ -130,10 +129,9 @@ fun Expr.uniqueDereferences( ): Pair, Expr> = if (this is Dereference<*, *, T>) { val ret = ArrayList() - Preconditions.checkState( - this.uniquenessIdx.isEmpty, - "Only non-pretransformed dereferences should be here", - ) + require(this.uniquenessIdx == null) { + "Only non-pretransformed dereferences should be here" + } val arrayExpr = ExprUtils.simplify( array.uniqueDereferences(vargen, lookup).also { ret.addAll(it.first) }.second diff --git a/subprojects/common/analysis/src/test/java/hu/bme/mit/theta/analysis/algorithm/HornTest.kt b/subprojects/common/analysis/src/test/java/hu/bme/mit/theta/analysis/algorithm/HornTest.kt index 376bb714d4..820a8e42af 100644 --- a/subprojects/common/analysis/src/test/java/hu/bme/mit/theta/analysis/algorithm/HornTest.kt +++ b/subprojects/common/analysis/src/test/java/hu/bme/mit/theta/analysis/algorithm/HornTest.kt @@ -21,7 +21,9 @@ import hu.bme.mit.theta.common.logging.NullLogger import hu.bme.mit.theta.core.Relation import hu.bme.mit.theta.core.decl.Decls.Param import hu.bme.mit.theta.core.plus -import hu.bme.mit.theta.core.type.inttype.IntExprs.* +import hu.bme.mit.theta.core.type.inttype.IntExprs.Add +import hu.bme.mit.theta.core.type.inttype.IntExprs.Eq +import hu.bme.mit.theta.core.type.inttype.IntExprs.Int import hu.bme.mit.theta.solver.z3.Z3SolverFactory import org.junit.jupiter.api.Assertions import org.junit.jupiter.api.Assumptions diff --git a/subprojects/common/analysis/src/test/java/hu/bme/mit/theta/analysis/algorithm/loopchecker/utils/VarCollectorStmtVisitorTest.kt b/subprojects/common/analysis/src/test/java/hu/bme/mit/theta/analysis/algorithm/loopchecker/utils/VarCollectorStmtVisitorTest.kt index 86105b2f93..64fcfdba19 100644 --- a/subprojects/common/analysis/src/test/java/hu/bme/mit/theta/analysis/algorithm/loopchecker/utils/VarCollectorStmtVisitorTest.kt +++ b/subprojects/common/analysis/src/test/java/hu/bme/mit/theta/analysis/algorithm/loopchecker/utils/VarCollectorStmtVisitorTest.kt @@ -25,7 +25,6 @@ import hu.bme.mit.theta.core.type.booltype.BoolExprs import hu.bme.mit.theta.core.type.booltype.BoolType import hu.bme.mit.theta.core.type.inttype.IntExprs import hu.bme.mit.theta.core.type.inttype.IntType -import java.util.* import org.junit.Assert import org.junit.Test import org.junit.runner.RunWith @@ -46,9 +45,9 @@ class VarCollectorStmtVisitorTest( companion object { - private val VA: VarDecl = Decls.Var("a", BoolExprs.Bool()) - private val VB: VarDecl = Decls.Var("b", IntExprs.Int()) - private val VC: VarDecl = Decls.Var("d", IntExprs.Int()) + private val VA: VarDecl = Decls.Var("a", BoolExprs.Bool()) + private val VB: VarDecl = Decls.Var("b", IntExprs.Int()) + private val VC: VarDecl = Decls.Var("d", IntExprs.Int()) @JvmStatic @Parameterized.Parameters diff --git a/subprojects/common/analysis/src/test/kotlin/hu/bme/mit/theta/analysis/multi/MultiAnalysisTest.kt b/subprojects/common/analysis/src/test/kotlin/hu/bme/mit/theta/analysis/multi/MultiAnalysisTest.kt index 556a043b73..6b105bbc88 100644 --- a/subprojects/common/analysis/src/test/kotlin/hu/bme/mit/theta/analysis/multi/MultiAnalysisTest.kt +++ b/subprojects/common/analysis/src/test/kotlin/hu/bme/mit/theta/analysis/multi/MultiAnalysisTest.kt @@ -40,45 +40,33 @@ class MultiAnalysisTest { class NumberedState(val num: Int) : ExprState { - override fun toExpr(): Expr? = True() + override fun toExpr(): Expr = True() override fun isBottom(): Boolean = false } class NumberedAction() : StmtAction() { - override fun getStmts(): List? { + override fun getStmts(): List { return listOf(SkipStmt.getInstance()) } } class NumberedAnalysis : Analysis { - override fun getPartialOrd(): PartialOrd? = - object : PartialOrd { - override fun isLeq(state1: NumberedState?, state2: NumberedState?): Boolean = - state1!!.num <= state2!!.num - } - - override fun getInitFunc(): InitFunc? = - object : InitFunc { - override fun getInitStates(prec: UnitPrec?): Collection? = - listOf(NumberedState(0)) - } - - override fun getTransFunc(): TransFunc? = - object : TransFunc { - override fun getSuccStates( - state: NumberedState?, - action: NumberedAction?, - prec: UnitPrec?, - ): Collection? = listOf(NumberedState(state!!.num + 1)) - } + override fun getPartialOrd(): PartialOrd = + PartialOrd { state1, state2 -> state1.num <= state2.num } + + override fun getInitFunc(): InitFunc = + InitFunc { listOf(NumberedState(0)) } + + override fun getTransFunc(): TransFunc = + TransFunc { state, action, prec -> listOf(NumberedState(state.num + 1)) } } class NumberedLTS : LTS { - override fun getEnabledActionsFor(state: NumberedState?): Collection? = + override fun getEnabledActionsFor(state: NumberedState): Collection = listOf(NumberedAction()) } @@ -96,10 +84,7 @@ class MultiAnalysisTest { > = MultiAnalysisSide( NumberedAnalysis(), - object : InitFunc { - override fun getInitStates(prec: UnitPrec?): Collection? = - listOf(NumberedState(0)) - }, + { listOf(NumberedState(0)) }, { c: NumberedState, _: UnitState -> c }, { c: NumberedState -> c }, { c: NumberedState -> UnitState.getInstance() }, @@ -114,10 +99,7 @@ class MultiAnalysisTest { if (ms.sourceSide == MultiSide.RIGHT || ms.leftState.num % 2 == 1) MultiSide.LEFT else MultiSide.RIGHT }, - object : InitFunc { - override fun getInitStates(prec: UnitPrec?): Collection? = - listOf(UnitState.getInstance()) - }, + { listOf(UnitState.getInstance()) }, ) val multiAnalysis = builderResult.side.analysis diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/ChcUtils.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/ChcUtils.kt index 1ba863961f..ba8f6720b6 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/ChcUtils.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/ChcUtils.kt @@ -21,7 +21,12 @@ import hu.bme.mit.theta.core.decl.Decls.Param import hu.bme.mit.theta.core.decl.ParamDecl import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.Type -import hu.bme.mit.theta.core.type.booltype.BoolExprs.* +import hu.bme.mit.theta.core.type.booltype.BoolExprs.And +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool +import hu.bme.mit.theta.core.type.booltype.BoolExprs.False +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Forall +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Imply +import hu.bme.mit.theta.core.type.booltype.BoolExprs.True import hu.bme.mit.theta.core.type.booltype.BoolType import hu.bme.mit.theta.core.type.functype.FuncExprs import hu.bme.mit.theta.core.type.functype.FuncType diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/Decls.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/Decls.kt index 9a21dae5b0..b19a03c0cd 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/Decls.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/Decls.kt @@ -19,19 +19,23 @@ package hu.bme.mit.theta.core.decl import hu.bme.mit.theta.core.type.Type /** Factory class to create declarations. */ +@Suppress("FunctionName") object Decls { /** * Create a constant declaration with a given name and type. */ + @JvmStatic fun Const(name: String, type: T): ConstDecl = BasicConstDecl(name, type) /** * Create a parameter declaration with a given name and type. */ + @JvmStatic fun Param(name: String, type: T): ParamDecl = ParamDecl(name, type) /** * Create a variable declaration with a given type. */ + @JvmStatic fun Var(name: String, type: T): VarDecl = VarDecl(name, type) } \ No newline at end of file diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/dsl/impl/ExprWriter.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/dsl/impl/ExprWriter.java index 1c05beeebb..943552ccde 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/dsl/impl/ExprWriter.java +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/dsl/impl/ExprWriter.java @@ -397,7 +397,7 @@ private String bvLit(final BvLitExpr expr) { private String arrayLit(final ArrayLitExpr expr) { return "[" + expr.getElements().stream() - .map(e -> write(e.get1()) + " <- " + write(e.get2())) + .map(e -> write(e.getFirst()) + " <- " + write(e.getSecond())) .collect(Collectors.joining(", ")) + "<" + expr.getType().getIndexType().toString() @@ -410,7 +410,7 @@ private String arrayLit(final ArrayLitExpr expr) { private String arrayInit(final ArrayInitExpr expr) { return "[" + expr.getElements().stream() - .map(e -> write(e.get1()) + " <- " + write(e.get2())) + .map(e -> write(e.getFirst()) + " <- " + write(e.getSecond())) .collect(Collectors.joining(", ")) + "<" + expr.getType().getIndexType().toString() diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/AssumeStmt.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/AssumeStmt.kt index d8ad63b8ee..8c19a32825 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/AssumeStmt.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/AssumeStmt.kt @@ -24,7 +24,7 @@ data class AssumeStmt(val cond: Expr) : Stmt { fun of(cond: Expr): AssumeStmt = AssumeStmt(cond) @JvmStatic - fun create(cond: Expr): AssumeStmt { + fun create(cond: Expr<*>): AssumeStmt { val newCond = cast(cond, Bool()) return of(newCond) } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/SkipStmt.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/SkipStmt.kt index 0dcdeafda0..a19c4da9a6 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/SkipStmt.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/SkipStmt.kt @@ -6,11 +6,14 @@ import kotlinx.serialization.Serializable @Serializable @SerialName(SkipStmt.STMT_LABEL) data object SkipStmt : Stmt { + internal const val STMT_LABEL = "skip" - override fun accept(visitor: StmtVisitor, param: P): R { - return visitor.visit(this, param) - } - + override fun accept(visitor: StmtVisitor, param: P): R = + visitor.visit(this, param) + + @JvmStatic + fun getInstance(): SkipStmt = this + override fun toString(): String = STMT_LABEL } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/Stmts.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/Stmts.kt index 17e7a983fd..2f2e075fca 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/Stmts.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/Stmts.kt @@ -11,6 +11,7 @@ import hu.bme.mit.theta.core.type.booltype.BoolType * * @see Stmt */ +@Suppress("FunctionName") object Stmts { /** Create a skip statement */ @@ -29,6 +30,7 @@ object Stmts { ): AssignStmt = AssignStmt.of(lhs, rhs) /** Create a memory assignment statement */ + @JvmStatic fun

MemoryAssign( deref: Dereference, expr: Expr diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/BinaryExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/BinaryExpr.kt index 44f88ecd44..b71253b548 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/BinaryExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/BinaryExpr.kt @@ -28,8 +28,8 @@ import kotlinx.serialization.Serializable @Serializable abstract class BinaryExpr : Expr { - protected abstract val leftOp: Expr - protected abstract val rightOp: Expr + abstract val leftOp: Expr + abstract val rightOp: Expr override val ops: List> get() = listOf(leftOp, rightOp) @@ -47,10 +47,10 @@ abstract class BinaryExpr : Expr { if (leftOp == this.leftOp && rightOp == this.rightOp) { this } else { - of(leftOp, rightOp) + new(leftOp, rightOp) } - protected abstract fun of(leftOp: Expr, rightOp: Expr): BinaryExpr + protected abstract fun new(leftOp: Expr, rightOp: Expr): BinaryExpr open fun withLeftOp(leftOp: Expr): BinaryExpr = with(leftOp, rightOp) diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/MultiaryExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/MultiaryExpr.kt index 0c81af0503..035e55710e 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/MultiaryExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/MultiaryExpr.kt @@ -48,8 +48,8 @@ abstract class MultiaryExpr : Expr { if (ops.toList() == this.ops) { this } else { - of(ops.toList()) + new(ops.toList()) } - protected abstract fun of(ops: List>): MultiaryExpr + protected abstract fun new(ops: List>): MultiaryExpr } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/UnaryExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/UnaryExpr.kt index 54875e123d..0584a50ba3 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/UnaryExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/UnaryExpr.kt @@ -45,9 +45,9 @@ abstract class UnaryExpr : Expr { override fun toString(): String = Utils.lispStringBuilder(operatorLabel).body().add(op).toString() open fun with(op: Expr): UnaryExpr = - if (op == this.op) this else of(op) + if (op == this.op) this else new(op) - protected abstract fun of(op: Expr): UnaryExpr + protected abstract fun new(op: Expr): UnaryExpr - protected abstract val operatorLabel: String + abstract val operatorLabel: String } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/Exprs.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/Exprs.kt index 5a27bf70a3..2ab64cce9b 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/Exprs.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/Exprs.kt @@ -47,14 +47,14 @@ object Exprs { offset: Expr, type: ExprType ): Dereference = - Dereference(arr, offset, type) + Dereference.of(arr, offset, type) @JvmStatic fun Reference( expr: Expr, type: ArrType ): Reference = - Reference(expr, type) + Reference.of(expr, type) // Convenience methods @JvmStatic diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/IteExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/IteExpr.kt index 07228ae402..d381e09df9 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/IteExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/IteExpr.kt @@ -72,6 +72,8 @@ data class IteExpr( override val ops: List> = listOf(cond, then, elze) + fun getElse(): Expr = elze + override fun eval(`val`: Valuation): LitExpr = if ((cond.eval(`val`) as BoolLitExpr).value) { then.eval(`val`) diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/PrimeExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/PrimeExpr.kt index a708a51097..f82bea0d53 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/PrimeExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/PrimeExpr.kt @@ -47,7 +47,7 @@ data class PrimeExpr( throw UnsupportedOperationException("Prime expressions cannot be evaluated") } - override fun of(op: Expr): PrimeExpr = Companion.of(op) + override fun new(op: Expr): PrimeExpr = of(op) override val operatorLabel: String = OPERATOR_LABEL } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayEqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayEqExpr.kt index a3d8e02633..fe4b355903 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayEqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayEqExpr.kt @@ -42,11 +42,11 @@ data class ArrayEqExpr( override fun eval(`val`: Valuation): LitExpr = throw UnsupportedOperationException() - override fun of( + override fun new( leftOp: Expr>, rightOp: Expr> ): ArrayEqExpr = - Companion.of(leftOp, rightOp) + of(leftOp, rightOp) override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayExprs.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayExprs.kt index 6870b5b5d6..bd643e46a3 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayExprs.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayExprs.kt @@ -1,5 +1,6 @@ package hu.bme.mit.theta.core.type.arraytype +import hu.bme.mit.theta.common.Tuple2 import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.Type import kotlinx.serialization.Serializable @@ -7,6 +8,7 @@ import kotlinx.serialization.Serializable /** * Factory and utility methods for array-type expressions. */ +@Suppress("FunctionName") object ArrayExprs { @JvmStatic fun Array( diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayInitExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayInitExpr.kt index e0818fa5f0..f3cc77feb2 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayInitExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayInitExpr.kt @@ -82,7 +82,7 @@ data class ArrayInitExpr( return of(newOps, elseElem, type) } - override fun of(ops: List>): MultiaryExpr> = with(ops) + override fun new(ops: List>): MultiaryExpr> = with(ops) @Suppress("UNCHECKED_CAST") override fun withOps(ops: List>): MultiaryExpr> = diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayNeqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayNeqExpr.kt index 38edaf44cb..4ce8328338 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayNeqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayNeqExpr.kt @@ -40,11 +40,11 @@ data class ArrayNeqExpr( override fun eval(`val`: Valuation): LitExpr = throw UnsupportedOperationException() - override fun of( + override fun new( leftOp: Expr>, rightOp: Expr> ): ArrayNeqExpr = - Companion.of(leftOp, rightOp) + of(leftOp, rightOp) override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/AndExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/AndExpr.kt index 1de3e585e4..adfb848853 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/AndExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/AndExpr.kt @@ -33,8 +33,8 @@ data class AndExpr( override fun eval(`val`: Valuation): BoolLitExpr = if (ops.any { !(it.eval(`val`) as BoolLitExpr).value }) False() else True() - override fun of(ops: List>): AndExpr = - Companion.of(ops) + override fun new(ops: List>): AndExpr = + of(ops) override fun toString(): String = Utils.lispStringBuilder(OPERATOR_LABEL).add(ops).toString() override val operatorLabel: String get() = OPERATOR_LABEL diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/BoolExprs.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/BoolExprs.kt index d456f5c220..c50d52a000 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/BoolExprs.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/BoolExprs.kt @@ -8,20 +8,48 @@ import hu.bme.mit.theta.core.type.Expr */ @Suppress("FunctionName") object BoolExprs { + + @JvmStatic fun Bool() = BoolType + + @JvmStatic fun Bool(value: Boolean) = BoolLitExpr.of(value) + + @JvmStatic fun True() = TrueExpr + + @JvmStatic fun False() = FalseExpr + + @JvmStatic fun Not(op: Expr) = NotExpr(op) + + @JvmStatic fun Imply(leftOp: Expr, rightOp: Expr) = ImplyExpr(leftOp, rightOp) + + @JvmStatic fun Iff(leftOp: Expr, rightOp: Expr) = IffExpr(leftOp, rightOp) + + @JvmStatic fun Xor(leftOp: Expr, rightOp: Expr) = XorExpr(leftOp, rightOp) + + @JvmStatic fun And(ops: Iterable>) = AndExpr.of(ops) + + @JvmStatic fun Or(ops: Iterable>) = OrExpr.of(ops) + + @JvmStatic fun Forall(paramDecls: Iterable>, op: Expr) = ForallExpr.of(paramDecls, op) + + @JvmStatic fun Exists(paramDecls: Iterable>, op: Expr) = ExistsExpr.of(paramDecls, op) + // Convenience methods + @JvmStatic fun And(vararg ops: Expr) = AndExpr.of(ops.asList()) + + @JvmStatic fun Or(vararg ops: Expr) = OrExpr.of(ops.asList()) } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/BoolLitExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/BoolLitExpr.kt index b9ccb217c1..5d56773922 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/BoolLitExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/BoolLitExpr.kt @@ -29,6 +29,7 @@ sealed class BoolLitExpr : NullaryExpr(), LitExpr { @SerialName("False") object FalseExpr : BoolLitExpr() { + @JvmStatic fun getInstance(): FalseExpr = this override val value: Boolean = false override fun toString(): String = "false" @@ -38,6 +39,7 @@ object FalseExpr : BoolLitExpr() { @SerialName("True") object TrueExpr : BoolLitExpr() { + @JvmStatic fun getInstance(): TrueExpr = this override val value: Boolean = true override fun toString(): String = "true" diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/BoolType.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/BoolType.kt index 9b65fcd470..a96a4ddba8 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/BoolType.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/BoolType.kt @@ -15,7 +15,10 @@ import kotlinx.serialization.Serializable object BoolType : Equational { internal const val TYPE_LABEL = "Bool" + + @JvmStatic fun getInstance(): BoolType = this + override fun toString(): String = TYPE_LABEL override fun Eq(leftOp: Expr, rightOp: Expr): IffExpr = diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/IffExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/IffExpr.kt index c107dd9fcc..715a647eaf 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/IffExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/IffExpr.kt @@ -33,7 +33,7 @@ data class IffExpr( override fun eval(`val`: Valuation): BoolLitExpr = Bool((leftOp.eval(`val`) as BoolLitExpr).value == (rightOp.eval(`val`) as BoolLitExpr).value) - override fun of(leftOp: Expr, rightOp: Expr): IffExpr = + override fun new(leftOp: Expr, rightOp: Expr): IffExpr = IffExpr(leftOp, rightOp) override fun toString(): String = super.toString() diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/ImplyExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/ImplyExpr.kt index 11c070bfa3..ff1fb6fa23 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/ImplyExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/ImplyExpr.kt @@ -28,7 +28,7 @@ data class ImplyExpr( override val type: BoolType = Bool() override fun eval(`val`: Valuation): BoolLitExpr = Bool(!(leftOp.eval(`val`) as BoolLitExpr).value || (rightOp.eval(`val`) as BoolLitExpr).value) - override fun of(leftOp: Expr, rightOp: Expr): ImplyExpr = + override fun new(leftOp: Expr, rightOp: Expr): ImplyExpr = ImplyExpr(leftOp, rightOp) override fun toString(): String = Utils.lispStringBuilder(OPERATOR_LABEL).add(leftOp).add(rightOp).toString() override val operatorLabel: String get() = OPERATOR_LABEL diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/NotExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/NotExpr.kt index 6c25e13abb..24fdea6619 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/NotExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/NotExpr.kt @@ -30,7 +30,7 @@ data class NotExpr( override val type: BoolType = Bool() override fun eval(`val`: Valuation): BoolLitExpr = Bool(!(op.eval(`val`) as BoolLitExpr).value) - override fun of(op: Expr): NotExpr = NotExpr(op) + override fun new(op: Expr): NotExpr = NotExpr(op) override fun toString(): String = Utils.lispStringBuilder(OPERATOR_LABEL).add(op).toString() override val operatorLabel: String = OPERATOR_LABEL } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/OrExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/OrExpr.kt index 116933e549..0edeb5c6fe 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/OrExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/OrExpr.kt @@ -35,8 +35,8 @@ data class OrExpr( override fun eval(`val`: Valuation): BoolLitExpr = if (ops.any { (it.eval(`val`) as BoolLitExpr).value }) True() else False() - override fun of(ops: List>): OrExpr = - Companion.of(ops) + override fun new(ops: List>): OrExpr = + of(ops) override fun toString(): String = Utils.lispStringBuilder(OPERATOR_LABEL).add(ops).toString() override val operatorLabel: String get() = OPERATOR_LABEL diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/SmartBoolExprs.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/SmartBoolExprs.kt index e09a8dc55b..ae6f05f792 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/SmartBoolExprs.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/SmartBoolExprs.kt @@ -7,6 +7,8 @@ import hu.bme.mit.theta.core.type.Expr */ @Suppress("FunctionName") object SmartBoolExprs { + + @JvmStatic fun Not(op: Expr): Expr = when (op) { BoolExprs.True() -> BoolExprs.False() BoolExprs.False() -> BoolExprs.True() @@ -14,6 +16,7 @@ object SmartBoolExprs { else -> BoolExprs.Not(op) } + @JvmStatic fun Imply(leftOp: Expr, rightOp: Expr): Expr = when { leftOp == BoolExprs.False() -> BoolExprs.True() leftOp == BoolExprs.True() -> rightOp @@ -22,6 +25,7 @@ object SmartBoolExprs { else -> BoolExprs.Imply(leftOp, rightOp) } + @JvmStatic fun And(ops: Collection>): Expr { if (ops.isEmpty()) return BoolExprs.True() if (BoolExprs.False() in ops) return BoolExprs.False() @@ -33,6 +37,7 @@ object SmartBoolExprs { } } + @JvmStatic fun Or(ops: Collection>): Expr { if (ops.isEmpty()) return BoolExprs.False() if (BoolExprs.True() in ops) return BoolExprs.True() @@ -45,7 +50,10 @@ object SmartBoolExprs { } // Convenience methods + @JvmStatic fun And(vararg ops: Expr) = And(ops.toList()) + + @JvmStatic fun Or(vararg ops: Expr) = Or(ops.toList()) } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/XorExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/XorExpr.kt index 30c6eb523b..3cd231d373 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/XorExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/XorExpr.kt @@ -34,8 +34,8 @@ data class XorExpr( override fun eval(`val`: Valuation): BoolLitExpr = Bool((leftOp.eval(`val`) as BoolLitExpr).value != (rightOp.eval(`val`) as BoolLitExpr).value) - override fun of(leftOp: Expr, rightOp: Expr): XorExpr = - Companion.of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): XorExpr = + of(leftOp, rightOp) override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvAddExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvAddExpr.kt index 86d2d351bb..5c3dfb980c 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvAddExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvAddExpr.kt @@ -45,7 +45,7 @@ data class BvAddExpr( acc.add(op.eval(`val`) as BvLitExpr) } - override fun of(ops: List>): BvAddExpr = Companion.of(ops) + override fun new(ops: List>): BvAddExpr = of(ops) override val operatorLabel: String get() = OPERATOR_LABEL diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvAndExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvAndExpr.kt index f9bd2b4522..2134decccb 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvAndExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvAndExpr.kt @@ -45,7 +45,7 @@ data class BvAndExpr( acc.and(op.eval(`val`) as BvLitExpr) } - override fun of(ops: List>): BvAndExpr = Companion.of(ops) + override fun new(ops: List>): BvAndExpr = of(ops) override val operatorLabel: String get() = OPERATOR_LABEL diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvArithShiftRightExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvArithShiftRightExpr.kt index 3b2b33e84e..23b9fcdfe1 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvArithShiftRightExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvArithShiftRightExpr.kt @@ -48,7 +48,7 @@ data class BvArithShiftRightExpr( return leftOpVal.arithShiftRight(rightOpVal) } - override fun of(leftOp: Expr, rightOp: Expr): BvArithShiftRightExpr = Companion.of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): BvArithShiftRightExpr = of(leftOp, rightOp) override val operatorLabel: String get() = OPERATOR_LABEL diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvEqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvEqExpr.kt index 948394c69d..cee3a03512 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvEqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvEqExpr.kt @@ -51,7 +51,7 @@ data class BvEqExpr( return leftOpVal.eq(rightOpVal) } - override fun of(leftOp: Expr, rightOp: Expr): BvEqExpr = Companion.of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): BvEqExpr = of(leftOp, rightOp) override val operatorLabel: String get() = OPERATOR_LABEL diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvExprs.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvExprs.kt index c1a50236b4..6c16d8d795 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvExprs.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvExprs.kt @@ -23,10 +23,16 @@ import hu.bme.mit.theta.core.type.inttype.IntLitExpr object BvExprs { @JvmStatic - fun BvType(size: Int, signedness: Boolean? = null) = BvType.of(size, signedness) + fun BvType(size: Int) = BvType.of(size, null) @JvmStatic - fun Bv(value: BooleanArray, signedness: Boolean? = null) = BvLitExpr(value, signedness) + fun BvType(size: Int, signedness: Boolean?) = BvType.of(size, signedness) + + @JvmStatic + fun Bv(value: BooleanArray) = BvLitExpr(value, null) + + @JvmStatic + fun Bv(value: BooleanArray, signedness: Boolean?) = BvLitExpr(value, signedness) @JvmStatic fun Concat(ops: Iterable>) = BvConcatExpr.of(ops) diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvLogicShiftRightExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvLogicShiftRightExpr.kt index 9625de5489..d84d1b8263 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvLogicShiftRightExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvLogicShiftRightExpr.kt @@ -48,7 +48,7 @@ data class BvLogicShiftRightExpr( return leftOpVal.logicShiftRight(rightOpVal) } - override fun of(leftOp: Expr, rightOp: Expr): BvLogicShiftRightExpr = Companion.of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): BvLogicShiftRightExpr = of(leftOp, rightOp) override val operatorLabel: String get() = OPERATOR_LABEL diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvMulExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvMulExpr.kt index b4839ceba3..948882985a 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvMulExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvMulExpr.kt @@ -45,7 +45,7 @@ data class BvMulExpr( acc.mul(op.eval(`val`) as BvLitExpr) } - override fun of(ops: List>): BvMulExpr = Companion.of(ops) + override fun new(ops: List>): BvMulExpr = of(ops) override val operatorLabel: String get() = OPERATOR_LABEL diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvNegExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvNegExpr.kt index acb98254b4..ce94e1f7b9 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvNegExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvNegExpr.kt @@ -46,7 +46,7 @@ data class BvNegExpr( return opVal.neg() } - override fun of(op: Expr): BvNegExpr = Companion.of(op) + override fun new(op: Expr): BvNegExpr = of(op) override val operatorLabel: String get() = OPERATOR_LABEL diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvNeqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvNeqExpr.kt index 1710e13fc1..b516fca719 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvNeqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvNeqExpr.kt @@ -51,7 +51,7 @@ data class BvNeqExpr( return leftOpVal.neq(rightOpVal) } - override fun of(leftOp: Expr, rightOp: Expr): BvNeqExpr = Companion.of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): BvNeqExpr = of(leftOp, rightOp) override val operatorLabel: String get() = OPERATOR_LABEL diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvNotExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvNotExpr.kt index 008335f3a2..25c6f41b41 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvNotExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvNotExpr.kt @@ -46,7 +46,7 @@ data class BvNotExpr( return opVal.not() } - override fun of(op: Expr): BvNotExpr = Companion.of(op) + override fun new(op: Expr): BvNotExpr = of(op) override val operatorLabel: String get() = OPERATOR_LABEL diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvOrExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvOrExpr.kt index 9105ecf9a4..0cee1f0d7b 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvOrExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvOrExpr.kt @@ -45,7 +45,7 @@ data class BvOrExpr( acc.or(op.eval(`val`) as BvLitExpr) } - override fun of(ops: List>): BvOrExpr = Companion.of(ops) + override fun new(ops: List>): BvOrExpr = of(ops) override val operatorLabel: String get() = OPERATOR_LABEL diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvPosExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvPosExpr.kt index 01fe80400f..a44a155525 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvPosExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvPosExpr.kt @@ -46,7 +46,7 @@ data class BvPosExpr( return opVal.pos() } - override fun of(op: Expr): BvPosExpr = Companion.of(op) + override fun new(op: Expr): BvPosExpr = of(op) override val operatorLabel: String get() = OPERATOR_LABEL diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvRotateLeftExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvRotateLeftExpr.kt index c2986ea688..2b68da5053 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvRotateLeftExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvRotateLeftExpr.kt @@ -48,7 +48,7 @@ data class BvRotateLeftExpr( return leftOpVal.rotateLeft(rightOpVal) } - override fun of(leftOp: Expr, rightOp: Expr): BvRotateLeftExpr = Companion.of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): BvRotateLeftExpr = of(leftOp, rightOp) override val operatorLabel: String get() = OPERATOR_LABEL diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvRotateRightExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvRotateRightExpr.kt index 80bad83ecb..e0bb825ec8 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvRotateRightExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvRotateRightExpr.kt @@ -48,7 +48,7 @@ data class BvRotateRightExpr( return leftOpVal.rotateRight(rightOpVal) } - override fun of(leftOp: Expr, rightOp: Expr): BvRotateRightExpr = Companion.of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): BvRotateRightExpr = of(leftOp, rightOp) override val operatorLabel: String get() = OPERATOR_LABEL diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSDivExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSDivExpr.kt index 6642440fa4..2c568687da 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSDivExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSDivExpr.kt @@ -43,7 +43,7 @@ data class BvSDivExpr( val rightOpVal = rightOp.eval(`val`) as BvLitExpr return leftOpVal.sdiv(rightOpVal) } - override fun of(leftOp: Expr, rightOp: Expr): BvSDivExpr = Companion.of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): BvSDivExpr = of(leftOp, rightOp) override val operatorLabel: String get() = OPERATOR_LABEL override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSGeqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSGeqExpr.kt index 02118b5ca6..e111ae7b86 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSGeqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSGeqExpr.kt @@ -50,7 +50,7 @@ data class BvSGeqExpr( return leftOpVal.sge(rightOpVal) } - override fun of(leftOp: Expr, rightOp: Expr): BvSGeqExpr = Companion.of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): BvSGeqExpr = of(leftOp, rightOp) override val operatorLabel: String get() = OPERATOR_LABEL override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSGtExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSGtExpr.kt index 188772ddbc..6e7b1c297f 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSGtExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSGtExpr.kt @@ -49,7 +49,7 @@ data class BvSGtExpr( return leftOpVal.sgt(rightOpVal) } - override fun of(leftOp: Expr, rightOp: Expr): BvSGtExpr = Companion.of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): BvSGtExpr = of(leftOp, rightOp) override val operatorLabel: String get() = OPERATOR_LABEL override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSLeqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSLeqExpr.kt index 00a43d4f16..8ef16e238e 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSLeqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSLeqExpr.kt @@ -49,7 +49,7 @@ data class BvSLeqExpr( return leftOpVal.sle(rightOpVal) } - override fun of(leftOp: Expr, rightOp: Expr): BvSLeqExpr = Companion.of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): BvSLeqExpr = of(leftOp, rightOp) override val operatorLabel: String get() = OPERATOR_LABEL override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSLtExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSLtExpr.kt index 6dba445356..0a04f0a8b3 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSLtExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSLtExpr.kt @@ -49,7 +49,7 @@ data class BvSLtExpr( return leftOpVal.slt(rightOpVal) } - override fun of(leftOp: Expr, rightOp: Expr): BvSLtExpr = Companion.of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): BvSLtExpr = of(leftOp, rightOp) override val operatorLabel: String get() = OPERATOR_LABEL override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSModExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSModExpr.kt index 2d6844289b..c3604b3d14 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSModExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSModExpr.kt @@ -43,7 +43,7 @@ data class BvSModExpr( val rightOpVal = rightOp.eval(`val`) as BvLitExpr return leftOpVal.smod(rightOpVal) } - override fun of(leftOp: Expr, rightOp: Expr): BvSModExpr = Companion.of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): BvSModExpr = of(leftOp, rightOp) override val operatorLabel: String get() = OPERATOR_LABEL override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSRemExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSRemExpr.kt index 6f101728c5..f74c00d7b4 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSRemExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSRemExpr.kt @@ -43,7 +43,7 @@ data class BvSRemExpr( val rightOpVal = rightOp.eval(`val`) as BvLitExpr return leftOpVal.srem(rightOpVal) } - override fun of(leftOp: Expr, rightOp: Expr): BvSRemExpr = Companion.of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): BvSRemExpr = of(leftOp, rightOp) override val operatorLabel: String get() = OPERATOR_LABEL override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvShiftLeftExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvShiftLeftExpr.kt index aec27d2ed3..d5089e24a7 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvShiftLeftExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvShiftLeftExpr.kt @@ -48,7 +48,7 @@ data class BvShiftLeftExpr( return leftOpVal.shiftLeft(rightOpVal) } - override fun of(leftOp: Expr, rightOp: Expr): BvShiftLeftExpr = Companion.of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): BvShiftLeftExpr = of(leftOp, rightOp) override val operatorLabel: String get() = OPERATOR_LABEL diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSignChangeExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSignChangeExpr.kt index 56f5db5c3a..9ca03ea1a7 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSignChangeExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSignChangeExpr.kt @@ -47,7 +47,7 @@ data class BvSignChangeExpr( return opVal.pos() } - override fun of(op: Expr): BvSignChangeExpr = Companion.of(op, newType) + override fun new(op: Expr): BvSignChangeExpr = of(op, newType) override val operatorLabel: String get() = OPERATOR_LABEL override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSubExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSubExpr.kt index 72f333283d..ccf6c26821 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSubExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSubExpr.kt @@ -48,7 +48,7 @@ data class BvSubExpr( return leftOpVal.sub(rightOpVal) } - override fun of(leftOp: Expr, rightOp: Expr): BvSubExpr = Companion.of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): BvSubExpr = of(leftOp, rightOp) override val operatorLabel: String get() = OPERATOR_LABEL diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvType.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvType.kt index c4ce1e8a46..957fe7f5db 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvType.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvType.kt @@ -52,7 +52,7 @@ data class BvType( fun withSize(size: Int): BvType = BvType(size, signed) - fun getSigned(): Boolean = signed ?: error("Signedness is not specified") + fun isSigned(): Boolean = signed ?: error("Signedness is not specified") override fun Eq(leftOp: Expr, rightOp: Expr) = BvEqExpr(leftOp, rightOp) override fun Neq(leftOp: Expr, rightOp: Expr) = BvNeqExpr(leftOp, rightOp) diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvUDivExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvUDivExpr.kt index 8f3598f448..46965ec3af 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvUDivExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvUDivExpr.kt @@ -43,7 +43,7 @@ data class BvUDivExpr( val rightOpVal = rightOp.eval(`val`) as BvLitExpr return leftOpVal.udiv(rightOpVal) } - override fun of(leftOp: Expr, rightOp: Expr): BvUDivExpr = Companion.of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): BvUDivExpr = of(leftOp, rightOp) override val operatorLabel: String get() = OPERATOR_LABEL override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvUGeqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvUGeqExpr.kt index 6906483f45..c958d4a447 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvUGeqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvUGeqExpr.kt @@ -50,7 +50,7 @@ data class BvUGeqExpr( return leftOpVal.uge(rightOpVal) } - override fun of(leftOp: Expr, rightOp: Expr): BvUGeqExpr = Companion.of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): BvUGeqExpr = of(leftOp, rightOp) override val operatorLabel: String get() = OPERATOR_LABEL override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvUGtExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvUGtExpr.kt index cd20df4b09..8febb5bebb 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvUGtExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvUGtExpr.kt @@ -49,7 +49,7 @@ data class BvUGtExpr( return leftOpVal.ugt(rightOpVal) } - override fun of(leftOp: Expr, rightOp: Expr): BvUGtExpr = Companion.of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): BvUGtExpr = of(leftOp, rightOp) override val operatorLabel: String get() = OPERATOR_LABEL override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvULeqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvULeqExpr.kt index b6afbabaa6..77611fc06a 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvULeqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvULeqExpr.kt @@ -49,7 +49,7 @@ data class BvULeqExpr( return leftOpVal.ule(rightOpVal) } - override fun of(leftOp: Expr, rightOp: Expr): BvULeqExpr = Companion.of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): BvULeqExpr = of(leftOp, rightOp) override val operatorLabel: String get() = OPERATOR_LABEL override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvULtExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvULtExpr.kt index 7915de3a00..191fb082ed 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvULtExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvULtExpr.kt @@ -50,7 +50,7 @@ data class BvULtExpr( return leftOpVal.ult(rightOpVal) } - override fun of(leftOp: Expr, rightOp: Expr): BvULtExpr = Companion.of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): BvULtExpr = of(leftOp, rightOp) override val operatorLabel: String get() = OPERATOR_LABEL override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvURemExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvURemExpr.kt index c45b6d445f..9cd6759d6d 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvURemExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvURemExpr.kt @@ -43,7 +43,7 @@ data class BvURemExpr( val rightOpVal = rightOp.eval(`val`) as BvLitExpr return leftOpVal.urem(rightOpVal) } - override fun of(leftOp: Expr, rightOp: Expr): BvURemExpr = Companion.of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): BvURemExpr = of(leftOp, rightOp) override val operatorLabel: String get() = OPERATOR_LABEL override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvXorExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvXorExpr.kt index 6ad2e7a460..5eb421fe5d 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvXorExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvXorExpr.kt @@ -45,7 +45,7 @@ data class BvXorExpr( acc.xor(op.eval(`val`) as BvLitExpr) } - override fun of(ops: List>): BvXorExpr = Companion.of(ops) + override fun new(ops: List>): BvXorExpr = of(ops) override val operatorLabel: String get() = OPERATOR_LABEL diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumEqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumEqExpr.kt index 3aaf8edfa5..3a34d3ca06 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumEqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumEqExpr.kt @@ -24,8 +24,8 @@ data class EnumEqExpr( override fun eval(`val`: Valuation): LitExpr = EnumLitExpr.eq(leftOp.eval(`val`) as EnumLitExpr, rightOp.eval(`val`) as EnumLitExpr) - override fun of(leftOp: Expr, rightOp: Expr): EnumEqExpr = - Companion.of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): EnumEqExpr = + of(leftOp, rightOp) override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumNeqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumNeqExpr.kt index e779851910..3e87e471cf 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumNeqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumNeqExpr.kt @@ -26,8 +26,8 @@ data class EnumNeqExpr( override fun eval(`val`: Valuation): LitExpr = EnumLitExpr.neq(leftOp.eval(`val`) as EnumLitExpr, rightOp.eval(`val`) as EnumLitExpr) - override fun of(leftOp: Expr, rightOp: Expr): EnumNeqExpr = - Companion.of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): EnumNeqExpr = + of(leftOp, rightOp) override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpAbsExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpAbsExpr.kt index fec011f39f..508ad170c5 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpAbsExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpAbsExpr.kt @@ -49,7 +49,7 @@ data class FpAbsExpr( } } - override fun of(op: Expr): FpAbsExpr = Companion.of(op) + override fun new(op: Expr): FpAbsExpr = of(op) override val operatorLabel: String get() = OPERATOR_LABEL diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpAddExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpAddExpr.kt index 0cac79283a..6fec5833b2 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpAddExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpAddExpr.kt @@ -54,7 +54,7 @@ data class FpAddExpr( acc.add(roundingMode, op.eval(`val`) as FpLitExpr) } - override fun of(ops: List>): FpAddExpr = Companion.of(roundingMode, ops) + override fun new(ops: List>): FpAddExpr = of(roundingMode, ops) override val operatorLabel: String get() = OPERATOR_LABEL diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpAssignExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpAssignExpr.kt index f1736ee16c..d471539568 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpAssignExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpAssignExpr.kt @@ -53,8 +53,8 @@ data class FpAssignExpr( return leftOpVal.assign(rightOpVal) } - override fun of(leftOp: Expr, rightOp: Expr): FpAssignExpr = - Companion.of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): FpAssignExpr = + of(leftOp, rightOp) override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpDivExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpDivExpr.kt index 96562ad35d..3672a1f2f6 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpDivExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpDivExpr.kt @@ -55,8 +55,8 @@ data class FpDivExpr( return leftOpVal.div(roundingMode, rightOpVal) } - override fun of(leftOp: Expr, rightOp: Expr): FpDivExpr = - Companion.of(roundingMode, leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): FpDivExpr = + of(roundingMode, leftOp, rightOp) override val operatorLabel: String get() = OPERATOR_LABEL diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpEqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpEqExpr.kt index ba3470a771..cf2d1bd53e 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpEqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpEqExpr.kt @@ -52,8 +52,8 @@ data class FpEqExpr( return leftOpVal.eq(rightOpVal) } - override fun of(leftOp: Expr, rightOp: Expr): FpEqExpr = - Companion.of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): FpEqExpr = + of(leftOp, rightOp) override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpFromBvExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpFromBvExpr.kt index 4eee4c2f06..d2c9cc57b7 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpFromBvExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpFromBvExpr.kt @@ -51,6 +51,8 @@ data class FpFromBvExpr( override val type: FpType get() = fpType + fun isSigned(): Boolean = signed + override fun eval(`val`: Valuation): FpLitExpr { val mathContext = FpUtils.getMathContext(fpType, roundingMode) val eval = op.eval(`val`) as BvLitExpr @@ -66,8 +68,8 @@ data class FpFromBvExpr( ) } - override fun of(op: Expr): FpFromBvExpr = - Companion.of(roundingMode, op, fpType, signed) + override fun new(op: Expr): FpFromBvExpr = + of(roundingMode, op, fpType, signed) override val operatorLabel: String = (OPERATOR_LABEL diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpGeqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpGeqExpr.kt index 6d747b0eb8..883088df14 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpGeqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpGeqExpr.kt @@ -52,8 +52,8 @@ data class FpGeqExpr( return leftOpVal.geq(rightOpVal) } - override fun of(leftOp: Expr, rightOp: Expr): FpGeqExpr = - Companion.of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): FpGeqExpr = + of(leftOp, rightOp) override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpGtExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpGtExpr.kt index 390c0721f4..d6e7ca8a7f 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpGtExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpGtExpr.kt @@ -51,8 +51,8 @@ data class FpGtExpr( return leftOpVal.gt(rightOpVal) } - override fun of(leftOp: Expr, rightOp: Expr): FpGtExpr = - Companion.of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): FpGtExpr = + of(leftOp, rightOp) override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpIsInfiniteExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpIsInfiniteExpr.kt index 1746595e4f..dd2ca24b4d 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpIsInfiniteExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpIsInfiniteExpr.kt @@ -51,7 +51,7 @@ data class FpIsInfiniteExpr( return or.eval(`val`) } - override fun of(op: Expr): FpIsInfiniteExpr = Companion.of(op) + override fun new(op: Expr): FpIsInfiniteExpr = of(op) override val operatorLabel: String get() = OPERATOR_LABEL diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpIsNanExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpIsNanExpr.kt index ea27b7fa27..5197bba2e4 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpIsNanExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpIsNanExpr.kt @@ -46,7 +46,7 @@ data class FpIsNanExpr( override fun eval(`val`: Valuation): BoolLitExpr = Bool((op.eval(`val`) as FpLitExpr).isNaN()) - override fun of(op: Expr): FpIsNanExpr = Companion.of(op) + override fun new(op: Expr): FpIsNanExpr = of(op) override val operatorLabel: String get() = OPERATOR_LABEL diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpLeqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpLeqExpr.kt index 2be80ac5d8..5e524560bc 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpLeqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpLeqExpr.kt @@ -51,8 +51,8 @@ data class FpLeqExpr( return leftOpVal.leq(rightOpVal) } - override fun of(leftOp: Expr, rightOp: Expr): FpLeqExpr = - Companion.of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): FpLeqExpr = + of(leftOp, rightOp) override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpLitExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpLitExpr.kt index 81478f136e..8371f5916c 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpLitExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpLitExpr.kt @@ -68,7 +68,7 @@ data class FpLitExpr( } } - override val type: FpType get() = FpType(exponent.type.size, significand.type.size) + override val type: FpType get() = FpType(exponent.type.size, significand.type.size + 1) override fun eval(`val`: Valuation): FpLitExpr = this fun isNaN(): Boolean { diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpLtExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpLtExpr.kt index c5eba6ed20..dd97526a3d 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpLtExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpLtExpr.kt @@ -53,8 +53,8 @@ data class FpLtExpr( return leftOpVal.lt(rightOpVal) } - override fun of(leftOp: Expr, rightOp: Expr): FpLtExpr = - Companion.of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): FpLtExpr = + of(leftOp, rightOp) override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpMaxExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpMaxExpr.kt index bec8f54895..6a762922a9 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpMaxExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpMaxExpr.kt @@ -64,8 +64,8 @@ data class FpMaxExpr( } } - override fun of(leftOp: Expr, rightOp: Expr): FpMaxExpr = - Companion.of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): FpMaxExpr = + of(leftOp, rightOp) override val operatorLabel: String get() = OPERATOR_LABEL diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpMinExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpMinExpr.kt index 0ef938ead2..f6a0c38146 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpMinExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpMinExpr.kt @@ -64,8 +64,8 @@ data class FpMinExpr( } } - override fun of(leftOp: Expr, rightOp: Expr): FpMinExpr = - Companion.of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): FpMinExpr = + of(leftOp, rightOp) override val operatorLabel: String get() = OPERATOR_LABEL diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpMulExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpMulExpr.kt index d6ff650d03..beae266ac7 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpMulExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpMulExpr.kt @@ -55,7 +55,7 @@ data class FpMulExpr( acc.mul(roundingMode, op.eval(`val`) as FpLitExpr) } - override fun of(ops: List>): FpMulExpr = Companion.of(roundingMode, ops) + override fun new(ops: List>): FpMulExpr = of(roundingMode, ops) override val operatorLabel: String get() = OPERATOR_LABEL diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpNegExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpNegExpr.kt index 8af7d022a8..dad971ea49 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpNegExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpNegExpr.kt @@ -45,7 +45,7 @@ data class FpNegExpr( override fun eval(`val`: Valuation): FpLitExpr = (op.eval(`val`) as FpLitExpr).neg() - override fun of(op: Expr): FpNegExpr = Companion.of(op) + override fun new(op: Expr): FpNegExpr = of(op) override val operatorLabel: String get() = OPERATOR_LABEL diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpNeqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpNeqExpr.kt index df56fb2c25..d6c5586df6 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpNeqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpNeqExpr.kt @@ -53,8 +53,8 @@ data class FpNeqExpr( return leftOpVal.neq(rightOpVal) } - override fun of(leftOp: Expr, rightOp: Expr): FpNeqExpr = - Companion.of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): FpNeqExpr = + of(leftOp, rightOp) override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpPosExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpPosExpr.kt index f2e331b90b..e1bee68d72 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpPosExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpPosExpr.kt @@ -43,7 +43,7 @@ data class FpPosExpr( override fun eval(`val`: Valuation): FpLitExpr = (op.eval(`val`) as FpLitExpr).pos() - override fun of(op: Expr): FpPosExpr = Companion.of(op) + override fun new(op: Expr): FpPosExpr = of(op) override val operatorLabel: String get() = OPERATOR_LABEL diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpRemExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpRemExpr.kt index 470ca64b92..6902b3f3f7 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpRemExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpRemExpr.kt @@ -60,8 +60,8 @@ data class FpRemExpr( return bigFloatToFpLitExpr(remainder, this.type) } - override fun of(leftOp: Expr, rightOp: Expr): FpRemExpr = - Companion.of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): FpRemExpr = + of(leftOp, rightOp) override val operatorLabel: String get() = OPERATOR_LABEL diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpRoundToIntegralExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpRoundToIntegralExpr.kt index b86d545871..26ea6c756f 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpRoundToIntegralExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpRoundToIntegralExpr.kt @@ -62,8 +62,8 @@ data class FpRoundToIntegralExpr( return fpLitExpr } - override fun of(op: Expr): FpRoundToIntegralExpr = - Companion.of(roundingMode, op) + override fun new(op: Expr): FpRoundToIntegralExpr = + of(roundingMode, op) override val operatorLabel: String get() = OPERATOR_LABEL diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpSqrtExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpSqrtExpr.kt index 38d7fc3df6..6bf5fcb62c 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpSqrtExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpSqrtExpr.kt @@ -54,8 +54,8 @@ data class FpSqrtExpr( return bigFloatToFpLitExpr(sqrt, type) } - override fun of(op: Expr): FpSqrtExpr = - Companion.of(roundingMode, op) + override fun new(op: Expr): FpSqrtExpr = + of(roundingMode, op) override val operatorLabel: String get() = OPERATOR_LABEL diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpSubExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpSubExpr.kt index 2a619c6095..515cfc8758 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpSubExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpSubExpr.kt @@ -57,8 +57,8 @@ data class FpSubExpr( return leftOpVal.sub(roundingMode, rightOpVal) } - override fun of(leftOp: Expr, rightOp: Expr): FpSubExpr = - Companion.of(roundingMode, leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): FpSubExpr = + of(roundingMode, leftOp, rightOp) override val operatorLabel: String get() = OPERATOR_LABEL diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpToBvExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpToBvExpr.kt index 2f38500b94..5cba2fb34c 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpToBvExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpToBvExpr.kt @@ -62,8 +62,8 @@ data class FpToBvExpr( } } - override fun of(op: Expr): FpToBvExpr = - Companion.of(roundingMode, op, size, sgn) + override fun new(op: Expr): FpToBvExpr = + of(roundingMode, op, size, sgn) override val operatorLabel: String = (OPERATOR_LABEL diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpToFpExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpToFpExpr.kt index 02c97bc39c..9785b3d03f 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpToFpExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpToFpExpr.kt @@ -53,8 +53,8 @@ data class FpToFpExpr( return bigFloatToFpLitExpr(value, type) } - override fun of(op: Expr): FpToFpExpr = - Companion.of(roundingMode, op, expBits, signBits) + override fun new(op: Expr): FpToFpExpr = + of(roundingMode, op, expBits, signBits) override val operatorLabel: String = "$OPERATOR_LABEL[$expBits,$signBits]" diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntAddExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntAddExpr.kt index 75ab0b2c38..5b6b1c148c 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntAddExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntAddExpr.kt @@ -52,8 +52,8 @@ data class IntAddExpr( return Int(sum) } - override fun of(ops: List>): IntAddExpr = - Companion.of(ops) + override fun new(ops: List>): IntAddExpr = + of(ops) override val operatorLabel: String get() = OPERATOR_LABEL override fun toString(): String = super.toString() diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntDivExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntDivExpr.kt index 99b2189373..dae53df3be 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntDivExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntDivExpr.kt @@ -47,8 +47,8 @@ data class IntDivExpr( return leftOpVal.div(rightOpVal) } - override fun of(leftOp: Expr, rightOp: Expr): IntDivExpr = - Companion.of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): IntDivExpr = + of(leftOp, rightOp) override val operatorLabel: String get() = OPERATOR_LABEL override fun toString(): String = super.toString() diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntEqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntEqExpr.kt index 1cd5b3bd16..f6b8c42652 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntEqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntEqExpr.kt @@ -47,8 +47,8 @@ data class IntEqExpr( return leftOpVal.eq(rightOpVal) } - override fun of(leftOp: Expr, rightOp: Expr): IntEqExpr = - Companion.of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): IntEqExpr = + of(leftOp, rightOp) override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntGeqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntGeqExpr.kt index 00fa41ac2f..2374ea3943 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntGeqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntGeqExpr.kt @@ -47,8 +47,8 @@ data class IntGeqExpr( return leftOpVal.geq(rightOpVal) } - override fun of(leftOp: Expr, rightOp: Expr): IntGeqExpr = - Companion.of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): IntGeqExpr = + of(leftOp, rightOp) override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntGtExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntGtExpr.kt index 985625b85e..65475d69c1 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntGtExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntGtExpr.kt @@ -46,8 +46,8 @@ data class IntGtExpr( return leftOpVal.gt(rightOpVal) } - override fun of(leftOp: Expr, rightOp: Expr): IntGtExpr = - Companion.of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): IntGtExpr = + of(leftOp, rightOp) override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLeqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLeqExpr.kt index 8b8bac2fb2..55e3c18dcd 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLeqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLeqExpr.kt @@ -47,8 +47,8 @@ data class IntLeqExpr( return leftOpVal.leq(rightOpVal) } - override fun of(leftOp: Expr, rightOp: Expr): IntLeqExpr = - Companion.of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): IntLeqExpr = + of(leftOp, rightOp) override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLtExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLtExpr.kt index cb7e2d4280..19c711b1f8 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLtExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLtExpr.kt @@ -47,8 +47,8 @@ data class IntLtExpr( return leftOpVal.lt(rightOpVal) } - override fun of(leftOp: Expr, rightOp: Expr): IntLtExpr = - Companion.of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): IntLtExpr = + of(leftOp, rightOp) override fun toString(): String = super.toString() diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntModExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntModExpr.kt index daa886f5fd..1bf357c9af 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntModExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntModExpr.kt @@ -47,8 +47,8 @@ data class IntModExpr( return leftOpVal.mod(rightOpVal) } - override fun of(leftOp: Expr, rightOp: Expr): IntModExpr = - Companion.of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): IntModExpr = + of(leftOp, rightOp) override val operatorLabel: String get() = OPERATOR_LABEL diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntMulExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntMulExpr.kt index e030ac42c0..6a2f000070 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntMulExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntMulExpr.kt @@ -50,8 +50,8 @@ data class IntMulExpr( return Int(prod) } - override fun of(ops: List>): IntMulExpr = - Companion.of(ops) + override fun new(ops: List>): IntMulExpr = + of(ops) override val operatorLabel: String get() = OPERATOR_LABEL override fun toString(): String = super.toString() diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntNegExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntNegExpr.kt index 3bf1829072..b12fe6823d 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntNegExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntNegExpr.kt @@ -45,7 +45,7 @@ data class IntNegExpr( return opVal.neg() } - override fun of(op: Expr): IntNegExpr = Companion.of(op) + override fun new(op: Expr): IntNegExpr = of(op) override val operatorLabel: String get() = OPERATOR_LABEL override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntNeqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntNeqExpr.kt index a467a7d78f..e9c539765f 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntNeqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntNeqExpr.kt @@ -46,8 +46,8 @@ data class IntNeqExpr( return leftOpVal.neq(rightOpVal) } - override fun of(leftOp: Expr, rightOp: Expr): IntNeqExpr = - Companion.of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): IntNeqExpr = + of(leftOp, rightOp) override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntPosExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntPosExpr.kt index 239f382355..7b8c5289c2 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntPosExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntPosExpr.kt @@ -45,7 +45,7 @@ data class IntPosExpr( return opVal.pos() } - override fun of(op: Expr): IntPosExpr = Companion.of(op) + override fun new(op: Expr): IntPosExpr = of(op) override val operatorLabel: String get() = OPERATOR_LABEL override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntRemExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntRemExpr.kt index 7a5e60d751..07759b5b80 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntRemExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntRemExpr.kt @@ -47,8 +47,8 @@ data class IntRemExpr( return leftOpVal.rem(rightOpVal) } - override fun of(leftOp: Expr, rightOp: Expr): IntRemExpr = - Companion.of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): IntRemExpr = + of(leftOp, rightOp) override val operatorLabel: String get() = OPERATOR_LABEL override fun toString(): String = super.toString() diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntSubExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntSubExpr.kt index 9c4fac33b0..eda0ef0744 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntSubExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntSubExpr.kt @@ -47,8 +47,8 @@ data class IntSubExpr( return leftOpVal.sub(rightOpVal) } - override fun of(leftOp: Expr, rightOp: Expr): IntSubExpr = - Companion.of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): IntSubExpr = + of(leftOp, rightOp) override val operatorLabel: String get() = OPERATOR_LABEL override fun toString(): String = super.toString() diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntToRatExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntToRatExpr.kt index 7a9d8334b1..ce9b94f3ee 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntToRatExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntToRatExpr.kt @@ -50,7 +50,7 @@ data class IntToRatExpr( return opVal.toRat() } - override fun of(op: Expr): IntToRatExpr = Companion.of(op) + override fun new(op: Expr): IntToRatExpr = of(op) override val operatorLabel: String get() = OPERATOR_LABEL override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntType.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntType.kt index 0603f38411..c5025e2de5 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntType.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntType.kt @@ -30,7 +30,10 @@ object IntType : Additive, Multiplicative, Divisible, Castable { internal const val TYPE_LABEL = "Int" + + @JvmStatic fun getInstance(): IntType = this + override fun toString(): String = TYPE_LABEL override fun Add(ops: Iterable>) = IntExprs.Add(ops) diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatAddExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatAddExpr.kt index 5114ab1ab4..eb0e928622 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatAddExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatAddExpr.kt @@ -60,7 +60,7 @@ class RatAddExpr( return Rat(sumNum, sumDenom) } - override fun of(ops: List>): RatAddExpr = of(ops) + override fun new(ops: List>): RatAddExpr = new(ops) override val operatorLabel: String = OPERATOR_LABEL diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatDivExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatDivExpr.kt index 84687e5bb4..a6c52a27a1 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatDivExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatDivExpr.kt @@ -60,8 +60,8 @@ data class RatDivExpr( return leftOpVal.div(rightOpVal) } - override fun of(leftOp: Expr, rightOp: Expr): RatDivExpr = - Companion.of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): RatDivExpr = + of(leftOp, rightOp) override val operatorLabel: String get() = OPERATOR_LABEL diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatEqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatEqExpr.kt index 72c35f28b2..40a95b0165 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatEqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatEqExpr.kt @@ -47,8 +47,8 @@ data class RatEqExpr( return leftOpVal.eq(rightOpVal) } - override fun of(leftOp: Expr, rightOp: Expr): RatEqExpr = - Companion.of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): RatEqExpr = + of(leftOp, rightOp) override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatGeqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatGeqExpr.kt index 5c6732a5f8..8d23a4d611 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatGeqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatGeqExpr.kt @@ -47,8 +47,8 @@ data class RatGeqExpr( return leftOpVal.geq(rightOpVal) } - override fun of(leftOp: Expr, rightOp: Expr): RatGeqExpr = - Companion.of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): RatGeqExpr = + of(leftOp, rightOp) override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatGtExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatGtExpr.kt index 85c5a0e5c1..25efd943d3 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatGtExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatGtExpr.kt @@ -47,8 +47,8 @@ data class RatGtExpr( return leftOpVal.gt(rightOpVal) } - override fun of(leftOp: Expr, rightOp: Expr): RatGtExpr = - Companion.of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): RatGtExpr = + of(leftOp, rightOp) override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatLeqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatLeqExpr.kt index 805a6c7274..8bcf96f622 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatLeqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatLeqExpr.kt @@ -45,8 +45,8 @@ data class RatLeqExpr( return leftOpVal.leq(rightOpVal) } - override fun of(leftOp: Expr, rightOp: Expr): RatLeqExpr = - Companion.of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): RatLeqExpr = + of(leftOp, rightOp) override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatLtExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatLtExpr.kt index d46a03f1d2..d4a057964c 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatLtExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatLtExpr.kt @@ -47,8 +47,8 @@ data class RatLtExpr( return leftOpVal.lt(rightOpVal) } - override fun of(leftOp: Expr, rightOp: Expr): RatLtExpr = - Companion.of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): RatLtExpr = + of(leftOp, rightOp) override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatMulExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatMulExpr.kt index cda295762b..27236bece4 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatMulExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatMulExpr.kt @@ -54,8 +54,8 @@ data class RatMulExpr( return Rat(prodNum, prodDenom) } - override fun of(ops: List>): RatMulExpr = - Companion.of(ops) + override fun new(ops: List>): RatMulExpr = + of(ops) override val operatorLabel: String get() = OPERATOR_LABEL override fun toString(): String = super.toString() diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatNegExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatNegExpr.kt index 3f881135af..9f5a1f58ba 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatNegExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatNegExpr.kt @@ -44,7 +44,7 @@ data class RatNegExpr( return opVal.neg() } - override fun of(op: Expr): RatNegExpr = Companion.of(op) + override fun new(op: Expr): RatNegExpr = of(op) override val operatorLabel: String get() = OPERATOR_LABEL override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatNeqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatNeqExpr.kt index 3976d7b687..6f6402340b 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatNeqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatNeqExpr.kt @@ -47,8 +47,8 @@ data class RatNeqExpr( return leftOpVal.neq(rightOpVal) } - override fun of(leftOp: Expr, rightOp: Expr): RatNeqExpr = - Companion.of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): RatNeqExpr = + of(leftOp, rightOp) override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatPosExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatPosExpr.kt index 3d2210b9f4..bb4fed6d97 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatPosExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatPosExpr.kt @@ -44,7 +44,7 @@ data class RatPosExpr( return opVal.pos() } - override fun of(op: Expr): RatPosExpr = Companion.of(op) + override fun new(op: Expr): RatPosExpr = of(op) override val operatorLabel: String get() = OPERATOR_LABEL override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatSubExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatSubExpr.kt index 42ec11751a..299db5d7a3 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatSubExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatSubExpr.kt @@ -46,8 +46,8 @@ data class RatSubExpr( return leftOpVal.sub(rightOpVal) } - override fun of(leftOp: Expr, rightOp: Expr): RatSubExpr = - Companion.of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): RatSubExpr = + of(leftOp, rightOp) override val operatorLabel: String get() = OPERATOR_LABEL diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatToIntExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatToIntExpr.kt index 3b8957e483..2965f60ae7 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatToIntExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatToIntExpr.kt @@ -51,7 +51,7 @@ data class RatToIntExpr( return opVal.toInt() } - override fun of(op: Expr): RatToIntExpr = Companion.of(op) + override fun new(op: Expr): RatToIntExpr = of(op) override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/utils/ExprSimplifier.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/utils/ExprSimplifier.java index 958b63e4d2..7535b5aaf5 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/utils/ExprSimplifier.java +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/utils/ExprSimplifier.java @@ -50,6 +50,8 @@ import java.util.Iterator; import java.util.List; import java.util.Optional; + +import kotlin.Pair; import org.kframework.mpfr.BigFloat; public final class ExprSimplifier { @@ -307,13 +309,13 @@ private Expr> simplifyGener private Expr> simplifyArrayInit( final ArrayInitExpr t, final Valuation val) { boolean nonLiteralFound = false; - List, Expr>> newElements = new ArrayList<>(); + List, Expr>> newElements = new ArrayList<>(); Expr newElseElem = simplify(t.getElseElem(), val); if (!(newElseElem instanceof LitExpr)) nonLiteralFound = true; - for (Tuple2, Expr> element : t.getElements()) { - Expr newIndex = simplify(element.get1(), val); - Expr newElement = simplify(element.get2(), val); - newElements.add(Tuple2.of(newIndex, newElement)); + for (Pair, Expr> element : t.getElements()) { + Expr newIndex = simplify(element.getFirst(), val); + Expr newElement = simplify(element.getSecond(), val); + newElements.add(new Pair(newIndex, newElement)); if (!(newElement instanceof LitExpr) || !(newIndex instanceof LitExpr)) nonLiteralFound = true; } diff --git a/subprojects/common/core/src/test/java/hu/bme/mit/theta/core/utils/StmtToExprTransformerTest.java b/subprojects/common/core/src/test/java/hu/bme/mit/theta/core/utils/StmtToExprTransformerTest.java index b5bb7885a4..74f2461803 100644 --- a/subprojects/common/core/src/test/java/hu/bme/mit/theta/core/utils/StmtToExprTransformerTest.java +++ b/subprojects/common/core/src/test/java/hu/bme/mit/theta/core/utils/StmtToExprTransformerTest.java @@ -60,11 +60,11 @@ public static Collection data() { {Stmts.Havoc(VX), ImmutableList.of(True())}, {Stmts.Assign(VX, Int(2)), ImmutableList.of(Eq(Prime(VX.getRef()), Int(2)))}, { - Stmts.SequenceStmt(ImmutableList.of(Stmts.Assume(And(True(), False())))), + Stmts.Sequence(ImmutableList.of(Stmts.Assume(And(True(), False())))), ImmutableList.of(And(ImmutableList.of(And(True(), False())))) }, { - Stmts.SequenceStmt( + Stmts.Sequence( ImmutableList.of( Stmts.Assign(VX, Int(2)), Stmts.Assign(VX, Int(2)))), ImmutableList.of( diff --git a/subprojects/common/core/src/testFixtures/java/hu/bme/mit/theta/core/utils/ArrayTestUtils.java b/subprojects/common/core/src/testFixtures/java/hu/bme/mit/theta/core/utils/ArrayTestUtils.java index 23ce8f0103..5387107e0e 100644 --- a/subprojects/common/core/src/testFixtures/java/hu/bme/mit/theta/core/utils/ArrayTestUtils.java +++ b/subprojects/common/core/src/testFixtures/java/hu/bme/mit/theta/core/utils/ArrayTestUtils.java @@ -15,23 +15,18 @@ */ package hu.bme.mit.theta.core.utils; -import static hu.bme.mit.theta.core.decl.Decls.Const; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.False; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.True; -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; +import hu.bme.mit.theta.core.type.arraytype.*; +import kotlin.Pair; -import hu.bme.mit.theta.common.Tuple2; -import hu.bme.mit.theta.core.type.arraytype.ArrayEqExpr; -import hu.bme.mit.theta.core.type.arraytype.ArrayInitExpr; -import hu.bme.mit.theta.core.type.arraytype.ArrayLitExpr; -import hu.bme.mit.theta.core.type.arraytype.ArrayNeqExpr; -import hu.bme.mit.theta.core.type.arraytype.ArrayReadExpr; -import hu.bme.mit.theta.core.type.arraytype.ArrayType; -import hu.bme.mit.theta.core.type.arraytype.ArrayWriteExpr; import java.util.Arrays; import java.util.Collection; import java.util.List; +import static hu.bme.mit.theta.core.decl.Decls.Const; +import static hu.bme.mit.theta.core.type.booltype.BoolExprs.False; +import static hu.bme.mit.theta.core.type.booltype.BoolExprs.True; +import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; + public class ArrayTestUtils { private ArrayTestUtils() {} @@ -68,7 +63,7 @@ public static Collection BasicOperations() { Int(3), ArrayReadExpr.of( ArrayLitExpr.of( - List.of(Tuple2.of(Int(42), Int(3))), + List.of(new Pair<>(Int(42), Int(3))), Int(5), ArrayType.of(Int(), Int())), Int(42)) @@ -78,7 +73,7 @@ public static Collection BasicOperations() { Int(3), ArrayReadExpr.of( ArrayInitExpr.of( - List.of(Tuple2.of(Int(42), Int(3))), + List.of(new Pair<>(Int(42), Int(3))), Int(5), ArrayType.of(Int(), Int())), Int(42)) diff --git a/subprojects/common/grammar/src/main/java/hu/bme/mit/theta/grammar/dsl/expr/ExprParser.kt b/subprojects/common/grammar/src/main/java/hu/bme/mit/theta/grammar/dsl/expr/ExprParser.kt index c6dc85f83b..16efd77f08 100644 --- a/subprojects/common/grammar/src/main/java/hu/bme/mit/theta/grammar/dsl/expr/ExprParser.kt +++ b/subprojects/common/grammar/src/main/java/hu/bme/mit/theta/grammar/dsl/expr/ExprParser.kt @@ -17,7 +17,6 @@ package hu.bme.mit.theta.grammar.dsl.expr import com.google.common.base.Preconditions import com.google.common.collect.ImmutableList -import hu.bme.mit.theta.common.Tuple2 import hu.bme.mit.theta.common.dsl.BasicScope import hu.bme.mit.theta.common.dsl.Env import hu.bme.mit.theta.common.dsl.Scope @@ -147,7 +146,7 @@ class ExpressionWrapper(scope: Scope, content: String) { ctx.decls .stream() .map { d: DeclContext -> - Decls.Param(d.name.getText(), TypeWrapper(d.ttype.textWithWS()).instantiate()) + Decls.Param(d.name.text, TypeWrapper(d.ttype.textWithWS()).instantiate()) } .collect(Collectors.toList()) } @@ -156,7 +155,7 @@ class ExpressionWrapper(scope: Scope, content: String) { //// override fun visitIteExpr(ctx: IteExprContext): Expr { return if (ctx.cond != null) { - val cond: Expr = TypeUtils.cast(ctx.cond.accept>(this), BoolExprs.Bool()) + val cond: Expr = cast(ctx.cond.accept>(this), BoolExprs.Bool()) val then: Expr<*> = ctx.then.accept>(this) val elze: Expr<*> = ctx.elze.accept>(this) AbstractExprs.Ite(cond, then, elze) @@ -168,9 +167,9 @@ class ExpressionWrapper(scope: Scope, content: String) { override fun visitIffExpr(ctx: IffExprContext): Expr { return if (ctx.rightOp != null) { val leftOp: Expr = - TypeUtils.cast(ctx.leftOp.accept>(this), BoolExprs.Bool()) + cast(ctx.leftOp.accept>(this), BoolExprs.Bool()) val rightOp: Expr = - TypeUtils.cast(ctx.rightOp.accept>(this), BoolExprs.Bool()) + cast(ctx.rightOp.accept>(this), BoolExprs.Bool()) BoolExprs.Iff(leftOp, rightOp) } else { visitChildren(ctx) @@ -180,9 +179,9 @@ class ExpressionWrapper(scope: Scope, content: String) { override fun visitImplyExpr(ctx: ImplyExprContext): Expr { return if (ctx.rightOp != null) { val leftOp: Expr = - TypeUtils.cast(ctx.leftOp.accept>(this), BoolExprs.Bool()) + cast(ctx.leftOp.accept>(this), BoolExprs.Bool()) val rightOp: Expr = - TypeUtils.cast(ctx.rightOp.accept>(this), BoolExprs.Bool()) + cast(ctx.rightOp.accept>(this), BoolExprs.Bool()) BoolExprs.Imply(leftOp, rightOp) } else { visitChildren(ctx) @@ -193,7 +192,7 @@ class ExpressionWrapper(scope: Scope, content: String) { return if (ctx.paramDecls != null) { val paramDecls = createParamList(ctx.paramDecls) push(paramDecls) - val op: Expr = TypeUtils.cast(ctx.op.accept>(this), BoolExprs.Bool()) + val op: Expr = cast(ctx.op.accept>(this), BoolExprs.Bool()) pop() BoolExprs.Forall(paramDecls, op) } else { @@ -205,7 +204,7 @@ class ExpressionWrapper(scope: Scope, content: String) { return if (ctx.paramDecls != null) { val paramDecls = createParamList(ctx.paramDecls) push(paramDecls) - val op: Expr = TypeUtils.cast(ctx.op.accept>(this), BoolExprs.Bool()) + val op: Expr = cast(ctx.op.accept>(this), BoolExprs.Bool()) pop() BoolExprs.Exists(paramDecls, op) } else { @@ -218,7 +217,7 @@ class ExpressionWrapper(scope: Scope, content: String) { val opStream: Stream> = ctx.ops .stream() - .map({ op: ExprContext -> TypeUtils.cast(op.accept>(this), BoolExprs.Bool()) }) + .map { op: ExprContext -> cast(op.accept>(this), BoolExprs.Bool()) } val ops: Collection> = opStream.collect(Collectors.toList()) BoolExprs.Or(ops) } else { @@ -229,9 +228,9 @@ class ExpressionWrapper(scope: Scope, content: String) { override fun visitXorExpr(ctx: XorExprContext): Expr { return if (ctx.rightOp != null) { val leftOp: Expr = - TypeUtils.cast(ctx.leftOp.accept>(this), BoolExprs.Bool()) + cast(ctx.leftOp.accept>(this), BoolExprs.Bool()) val rightOp: Expr = - TypeUtils.cast(ctx.rightOp.accept>(this), BoolExprs.Bool()) + cast(ctx.rightOp.accept>(this), BoolExprs.Bool()) BoolExprs.Xor(leftOp, rightOp) } else { visitChildren(ctx) @@ -243,7 +242,7 @@ class ExpressionWrapper(scope: Scope, content: String) { val opStream: Stream> = ctx.ops .stream() - .map({ op: ExprContext -> TypeUtils.cast(op.accept>(this), BoolExprs.Bool()) }) + .map { op: ExprContext -> cast(op.accept>(this), BoolExprs.Bool()) } val ops: Collection> = opStream.collect(Collectors.toList()) BoolExprs.And(ops) } else { @@ -253,7 +252,7 @@ class ExpressionWrapper(scope: Scope, content: String) { override fun visitNotExpr(ctx: NotExprContext): Expr { return if (ctx.op != null) { - val op: Expr = TypeUtils.cast(ctx.op.accept>(this), BoolExprs.Bool()) + val op: Expr = cast(ctx.op.accept>(this), BoolExprs.Bool()) BoolExprs.Not(op) } else { visitChildren(ctx) @@ -264,7 +263,7 @@ class ExpressionWrapper(scope: Scope, content: String) { return if (ctx.rightOp != null) { val leftOp: Expr<*> = ctx.leftOp.accept>(this) val rightOp: Expr<*> = ctx.rightOp.accept>(this) - when (ctx.oper.getType()) { + when (ctx.oper.type) { EQ -> AbstractExprs.Eq(leftOp, rightOp) NEQ -> AbstractExprs.Neq(leftOp, rightOp) else -> throw ParseException(ctx, "Unknown operator") @@ -278,7 +277,7 @@ class ExpressionWrapper(scope: Scope, content: String) { return if (ctx.rightOp != null) { val leftOp: Expr<*> = ctx.leftOp.accept>(this) val rightOp: Expr<*> = ctx.rightOp.accept>(this) - when (ctx.oper.getType()) { + when (ctx.oper.type) { LT -> AbstractExprs.Lt(leftOp, rightOp) LEQ -> AbstractExprs.Leq(leftOp, rightOp) GT -> AbstractExprs.Gt(leftOp, rightOp) @@ -302,7 +301,7 @@ class ExpressionWrapper(scope: Scope, content: String) { return if (ctx.rightOp != null) { val leftOp = ctx.leftOp.accept>(this) as Expr val rightOp = ctx.rightOp.accept>(this) as Expr - when (ctx.oper.getType()) { + when (ctx.oper.type) { FPMAX -> FpExprs.Max(leftOp, rightOp) FPMIN -> FpExprs.Min(leftOp, rightOp) else -> throw ParseException(ctx, "Unknown operator") @@ -331,8 +330,8 @@ class ExpressionWrapper(scope: Scope, content: String) { return if (ctx.rightOp != null) { val leftOp = TypeUtils.castBv(ctx.leftOp.accept>(this)) val rightOp = TypeUtils.castBv(ctx.rightOp.accept>(this)) - when (ctx.oper.getType()) { - BV_XOR -> BvExprs.Xor(java.util.List.of(leftOp, rightOp)) + when (ctx.oper.type) { + BV_XOR -> BvExprs.Xor(listOf(leftOp, rightOp)) else -> throw ParseException(ctx, "Unknown operator") } } else { @@ -358,7 +357,7 @@ class ExpressionWrapper(scope: Scope, content: String) { return if (ctx.rightOp != null) { val leftOp = TypeUtils.castBv(ctx.leftOp.accept>(this)) val rightOp = TypeUtils.castBv(ctx.rightOp.accept>(this)) - when (ctx.oper.getType()) { + when (ctx.oper.type) { BV_SHL -> BvExprs.ShiftLeft(leftOp, rightOp) BV_ASHR -> BvExprs.ArithShiftRight(leftOp, rightOp) BV_LSHR -> BvExprs.LogicShiftRight(leftOp, rightOp) @@ -415,7 +414,7 @@ class ExpressionWrapper(scope: Scope, content: String) { FPADD -> FpExprs.Add( getRoundingMode(ctx.oper.text), - java.util.List.of(TypeUtils.castFp(leftOp), TypeUtils.castFp(rightOp)), + listOf(TypeUtils.castFp(leftOp), TypeUtils.castFp(rightOp)), ) FPSUB -> @@ -449,7 +448,7 @@ class ExpressionWrapper(scope: Scope, content: String) { ImmutableList.builder>().addAll(leftOp.ops).add(rightOp).build() BvExprs.Add(ops) } else { - BvExprs.Add(Arrays.asList(leftOp, rightOp)) + BvExprs.Add(listOf(leftOp, rightOp)) } } @@ -504,18 +503,18 @@ class ExpressionWrapper(scope: Scope, content: String) { REM -> createRemExpr(leftOp, rightOp) BV_UREM -> createBvURemExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) BV_SREM -> createBvSRemExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) - FPREM -> FpExprs.Rem(leftOp as Expr, rightOp as Expr) + FPREM -> FpExprs.Rem(leftOp as Expr, rightOp as Expr) FPMUL -> FpExprs.Mul( getRoundingMode(ctx.oper.text), - java.util.List.of(leftOp as Expr, rightOp as Expr), + listOf(leftOp as Expr, rightOp as Expr), ) FPDIV -> FpExprs.Div( getRoundingMode(ctx.oper.text), - leftOp as Expr, - rightOp as Expr, + leftOp as Expr, + rightOp as Expr, ) else -> throw ParseException(ctx, "Unknown operator '" + oper.text + "'") @@ -538,7 +537,7 @@ class ExpressionWrapper(scope: Scope, content: String) { ImmutableList.builder>().addAll(leftOp.ops).add(rightOp).build() BvExprs.Mul(ops) } else { - BvExprs.Mul(Arrays.asList(leftOp, rightOp)) + BvExprs.Mul(listOf(leftOp, rightOp)) } } @@ -620,14 +619,14 @@ class ExpressionWrapper(scope: Scope, content: String) { ImmutableList.builder>().addAll(leftOp.ops).add(rightOp).build() BvExprs.Concat(ops) } else { - BvExprs.Concat(Arrays.asList(leftOp, rightOp)) + BvExprs.Concat(listOf(leftOp, rightOp)) } } override fun visitBvExtendExpr(ctx: BvExtendExprContext): Expr { return if (ctx.rightOp != null) { - val extendType = BvExprs.BvType(ctx.rightOp.size.getText().toInt()) - when (ctx.oper.getType()) { + val extendType = BvExprs.BvType(ctx.rightOp.size.text.toInt()) + when (ctx.oper.type) { BV_ZERO_EXTEND -> BvExprs.ZExt(TypeUtils.castBv(ctx.leftOp.accept>(this)), extendType) @@ -645,42 +644,42 @@ class ExpressionWrapper(scope: Scope, content: String) { override fun visitUnaryExpr(ctx: UnaryExprContext): Expr { return if (ctx.op != null) { val op: Expr<*> = ctx.op.accept>(this) - when (ctx.oper.getType()) { + when (ctx.oper.type) { PLUS -> AbstractExprs.Pos(op) MINUS -> AbstractExprs.Neg(op) - FP_ABS -> FpExprs.Abs(op as Expr) - FP_IS_INF -> FpExprs.IsInfinite(op as Expr) - FP_IS_NAN -> FpExprs.IsNan(op as Expr) + FP_ABS -> FpExprs.Abs(op as Expr) + FP_IS_INF -> FpExprs.IsInfinite(op as Expr) + FP_IS_NAN -> FpExprs.IsNan(op as Expr) FPROUNDTOINT -> - FpExprs.RoundToIntegral(getRoundingMode(ctx.oper.text), op as Expr) + FpExprs.RoundToIntegral(getRoundingMode(ctx.oper.text), op as Expr) - FPSQRT -> FpExprs.Sqrt(getRoundingMode(ctx.oper.text), op as Expr) + FPSQRT -> FpExprs.Sqrt(getRoundingMode(ctx.oper.text), op as Expr) FPTOFP -> FpExprs.ToFp( getRoundingMode(ctx.oper.text), - op as Expr, - getExp(ctx.oper.getText()), - getSignificand(ctx.oper.getText()), + op as Expr, + getExp(ctx.oper.text), + getSignificand(ctx.oper.text), ) FPTOBV -> FpExprs.ToBv( getRoundingMode(ctx.oper.text), - op as Expr, - getBvSize(ctx.oper.getText()), - isSignedBv(ctx.oper.getText()), + op as Expr, + getBvSize(ctx.oper.text), + isSignedBv(ctx.oper.text), ) FP_FROM_BV -> FpExprs.FromBv( getRoundingMode(ctx.oper.text), - op as Expr, - FpType.of(getExp(ctx.oper.getText()), getSignificand(ctx.oper.getText())), - isSignedFp(ctx.oper.getText()), + op as Expr, + FpType.of(getExp(ctx.oper.text), getSignificand(ctx.oper.text)), + isSignedFp(ctx.oper.text), ) - FPNEG -> FpExprs.Neg(op as Expr) - FPPOS -> FpExprs.Pos(op as Expr) + FPNEG -> FpExprs.Neg(op as Expr) + FPPOS -> FpExprs.Pos(op as Expr) BV_POS -> BvExprs.Pos(op as Expr) BV_NEG -> BvExprs.Neg(op as Expr) else -> throw ParseException(ctx, "Unknown operator") @@ -788,7 +787,7 @@ class ExpressionWrapper(scope: Scope, content: String) { return if (ctx.op != null) { val op = ctx.op.accept(this) val bitvec = TypeUtils.castBv(op) - return BvExprs.Extract(bitvec, Int(ctx.from.getText()), IntExprs.Int(ctx.until.getText())) + return BvExprs.Extract(bitvec, Int(ctx.from.text), Int(ctx.until.text)) } else { visitChildren(ctx) } @@ -825,13 +824,13 @@ class ExpressionWrapper(scope: Scope, content: String) { } override fun visitIntLitExpr(ctx: IntLitExprContext): IntLitExpr { - val value: BigInteger = BigInteger(ctx.text) - return IntExprs.Int(value) + val value = BigInteger(ctx.text) + return Int(value) } override fun visitRatLitExpr(ctx: RatLitExprContext): RatLitExpr { val num = BigInteger(ctx.num.text) - val denom = BigInteger(ctx.denom.getText()) + val denom = BigInteger(ctx.denom.text) return RatExprs.Rat(num, denom) } @@ -849,7 +848,7 @@ class ExpressionWrapper(scope: Scope, content: String) { val valueType = elseElem.type val elems = ctx.indexExpr.mapIndexed { idx, it -> - Tuple2.of(it.accept(this), ctx.valueExpr[idx].accept(this)) + Pair(it.accept(this), ctx.valueExpr[idx].accept(this)) } return ExprUtils.simplify( ArrayInitExpr.create(elems, elseElem, ArrayType.of(indexType, valueType)) @@ -858,7 +857,7 @@ class ExpressionWrapper(scope: Scope, content: String) { override fun visitBvLitExpr(ctx: BvLitExprContext): Expr { val sizeAndContent: Array = - ctx.bv.getText().split("['#]".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray() + ctx.bv.text.split("['#]".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray() val content = if (sizeAndContent.size == 2) sizeAndContent[1] else sizeAndContent[0] val value: BooleanArray = if (content.startsWith("b")) { @@ -875,12 +874,12 @@ class ExpressionWrapper(scope: Scope, content: String) { for (i in value.indices) { bvValue[value.size - 1 - i] = value[value.size - 1 - i] } - return BvExprs.Bv(bvValue) + return Bv(bvValue) } private fun decodeBinaryBvContent(lit: String): BooleanArray { val value = BooleanArray(lit.length) - for (i in 0 until lit.length) { + for (i in lit.indices) { when (lit.toCharArray()[i]) { '0' -> value[i] = false '1' -> value[i] = true @@ -893,11 +892,11 @@ class ExpressionWrapper(scope: Scope, content: String) { private fun decodeDecimalBvContent(lit: String, size: Int): BooleanArray { var value = BigInteger(lit) Preconditions.checkArgument( - value.compareTo(BigInteger.TWO.pow(size - 1).multiply(BigInteger.valueOf(-1))) >= 0 && - value.compareTo(BigInteger.TWO.pow(size)) < 0, + value >= BigInteger.TWO.pow(size - 1).multiply(BigInteger.valueOf(-1)) && + value < BigInteger.TWO.pow(size), "Decimal literal is not in range", ) - if (value.compareTo(BigInteger.ZERO) < 0) { + if (value < BigInteger.ZERO) { value = value.add(BigInteger.TWO.pow(size)) } return decodeBinaryBvContent(value.toString(2)) @@ -905,7 +904,7 @@ class ExpressionWrapper(scope: Scope, content: String) { private fun decodeHexadecimalBvContent(lit: String): BooleanArray { val builder = StringBuilder() - for (i in 0 until lit.length) { + for (i in lit.indices) { when (lit.toCharArray()[i].lowercaseChar()) { '0' -> builder.append("0000") '1' -> builder.append("0001") @@ -930,9 +929,9 @@ class ExpressionWrapper(scope: Scope, content: String) { } override fun visitIdExpr(ctx: IdExprContext): RefExpr<*> { - val optSymbol = currentScope.resolve(ctx.id.getText()) + val optSymbol = currentScope.resolve(ctx.id.text) if (optSymbol.isEmpty) { - throw ParseException(ctx, "Identifier '" + ctx.id.getText() + "' cannot be resolved") + throw ParseException(ctx, "Identifier '" + ctx.id.text + "' cannot be resolved") } val symbol = optSymbol.get() val decl = env.eval(symbol) as Decl<*> diff --git a/subprojects/common/ltl/src/main/kotlin/hu/bme/mit/theta/common/cfa/buchi/hoa/APGeneratorVisitor.kt b/subprojects/common/ltl/src/main/kotlin/hu/bme/mit/theta/common/cfa/buchi/hoa/APGeneratorVisitor.kt index bf6f705c92..da6e125dd0 100644 --- a/subprojects/common/ltl/src/main/kotlin/hu/bme/mit/theta/common/cfa/buchi/hoa/APGeneratorVisitor.kt +++ b/subprojects/common/ltl/src/main/kotlin/hu/bme/mit/theta/common/cfa/buchi/hoa/APGeneratorVisitor.kt @@ -179,7 +179,7 @@ class APGeneratorVisitor( } override fun visitEnumLitExpr(ctx: EnumLitExprContext): Expr<*> { - return EnumLitExpr.of(enumTypes[ctx.type.text], ctx.lit.text) + return EnumLitExpr.of(enumTypes[ctx.type.text]!!, ctx.lit.text) } override fun visitVariable(ctx: LTLGrammarParser.VariableContext): Expr<*> { diff --git a/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/grammar/expression/ExpressionVisitor.java b/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/grammar/expression/ExpressionVisitor.java index 08c48a1edb..f3c50bab7a 100644 --- a/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/grammar/expression/ExpressionVisitor.java +++ b/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/grammar/expression/ExpressionVisitor.java @@ -374,7 +374,7 @@ public Expr visitShiftExpression(CParser.ShiftExpressionContext ctx) { (BvType) smallestCommonType.getSmtType()); if (ctx.signs.get(i - 1).getText().equals(">>")) { // TODO: is this sound? - if (leftExpr.getType().getSigned()) { + if (leftExpr.getType().isSigned()) { expr = BvExprs.ArithShiftRight(leftExpr, rightExpr); } else { expr = BvExprs.LogicShiftRight(leftExpr, rightExpr); diff --git a/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/model/types/complex/CComplexType.java b/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/model/types/complex/CComplexType.java index 4314f23788..b574811452 100644 --- a/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/model/types/complex/CComplexType.java +++ b/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/model/types/complex/CComplexType.java @@ -214,23 +214,23 @@ private static CComplexType getType(Type type, ParseContext parseContext) { case "bool": return new CBool(null, parseContext); case "short": - return ((BvType) type).getSigned() + return ((BvType) type).isSigned() ? new CSignedShort(null, parseContext) : new CUnsignedShort(null, parseContext); case "int": - return ((BvType) type).getSigned() + return ((BvType) type).isSigned() ? new CSignedInt(null, parseContext) : new CUnsignedInt(null, parseContext); case "long": - return ((BvType) type).getSigned() + return ((BvType) type).isSigned() ? new CSignedLong(null, parseContext) : new CUnsignedLong(null, parseContext); case "longlong": - return ((BvType) type).getSigned() + return ((BvType) type).isSigned() ? new CSignedLongLong(null, parseContext) : new CUnsignedLongLong(null, parseContext); case "__int128": - return ((BvType) type).getSigned() + return ((BvType) type).isSigned() ? new CSigned128(null, parseContext) : new CUnsigned128(null, parseContext); } diff --git a/subprojects/solver/graph-solver/src/main/java/hu/bme/mit/theta/graphsolver/compilers/pattern2expr/Pattern2ExprCompiler.kt b/subprojects/solver/graph-solver/src/main/java/hu/bme/mit/theta/graphsolver/compilers/pattern2expr/Pattern2ExprCompiler.kt index a01e511885..ad95b6305c 100644 --- a/subprojects/solver/graph-solver/src/main/java/hu/bme/mit/theta/graphsolver/compilers/pattern2expr/Pattern2ExprCompiler.kt +++ b/subprojects/solver/graph-solver/src/main/java/hu/bme/mit/theta/graphsolver/compilers/pattern2expr/Pattern2ExprCompiler.kt @@ -22,7 +22,13 @@ import hu.bme.mit.theta.core.decl.ConstDecl import hu.bme.mit.theta.core.decl.Decls.Const import hu.bme.mit.theta.core.model.Valuation import hu.bme.mit.theta.core.type.Expr -import hu.bme.mit.theta.core.type.booltype.BoolExprs.* +import hu.bme.mit.theta.core.type.booltype.BoolExprs.And +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool +import hu.bme.mit.theta.core.type.booltype.BoolExprs.False +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Not +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Or +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Iff +import hu.bme.mit.theta.core.type.booltype.BoolExprs.True import hu.bme.mit.theta.core.type.booltype.BoolType import hu.bme.mit.theta.graphsolver.ThreeVL import hu.bme.mit.theta.graphsolver.compilers.GraphPatternCompiler @@ -47,7 +53,6 @@ class Pattern2ExprCompiler : GraphPatternCompiler, Map, model: Valuation, @@ -103,14 +108,14 @@ class Pattern2ExprCompiler : GraphPatternCompiler, Map { val compiled = reflexive.constrainedRule.accept(this) - val ret = And(Or(events.map { compiled[Tuple2.of(it, it)] }), And(transitiveConstraints)) + val ret = And(Or(events.map { compiled[Tuple2.of(it, it)]!! }), And(transitiveConstraints)) transitiveConstraints.clear() return ret } override fun compile(irreflexive: Irreflexive): Expr { val compiled = irreflexive.constrainedRule.accept(this) - val ret = And(Not(Or(events.map { compiled[Tuple2.of(it, it)] })), And(transitiveConstraints)) + val ret = And(Not(Or(events.map { compiled[Tuple2.of(it, it)]!! })), And(transitiveConstraints)) transitiveConstraints.clear() return ret } @@ -122,7 +127,7 @@ class Pattern2ExprCompiler : GraphPatternCompiler, Map events.map { b -> - Pair(Tuple2.of(a, b), And(op1Compiled[Tuple1.of(a)], op2Compiled[Tuple1.of(b)])) + Pair(Tuple2.of(a, b), And(op1Compiled[Tuple1.of(a)]!!, op2Compiled[Tuple1.of(b)]!!)) } } return ret.flatten().toMap() @@ -143,7 +148,7 @@ class Pattern2ExprCompiler : GraphPatternCompiler, Map Pair( Tuple2.of(a, b), - And(op1Compiled[Tuple2.of(a, b)], Not(op2Compiled[Tuple2.of(a, b)])), + And(op1Compiled[Tuple2.of(a, b)]!!, Not(op2Compiled[Tuple2.of(a, b)]!!)), ) } } @@ -156,7 +161,7 @@ class Pattern2ExprCompiler : GraphPatternCompiler, Map - Pair(Tuple1.of(a), And(op1Compiled[Tuple1.of(a)], Not(op2Compiled[Tuple1.of(a)]))) + Pair(Tuple1.of(a), And(op1Compiled[Tuple1.of(a)]!!, Not(op2Compiled[Tuple1.of(a)]!!))) } return ret.toMap() } @@ -165,7 +170,7 @@ class Pattern2ExprCompiler : GraphPatternCompiler, Map Pair(Tuple1.of(a), Or(events.map { b -> opCompiled[Tuple2.of(a, b)] })) } + events.map { a -> Pair(Tuple1.of(a), Or(events.map { b -> opCompiled[Tuple2.of(a, b)]!! })) } return ret.toMap() } @@ -182,7 +187,7 @@ class Pattern2ExprCompiler : GraphPatternCompiler, Map events.map { b -> - Pair(Tuple2.of(a, b), if (a == b) True() else checkNotNull(opCompiled[Tuple2.of(a, b)])) + Pair(Tuple2.of(a, b), if (a == b) True() else opCompiled[Tuple2.of(a, b)]!!) } } .flatten() @@ -196,7 +201,7 @@ class Pattern2ExprCompiler : GraphPatternCompiler, Map events.map { b -> - Pair(Tuple2.of(a, b), And(op1Compiled[Tuple2.of(a, b)], op2Compiled[Tuple2.of(a, b)])) + Pair(Tuple2.of(a, b), And(op1Compiled[Tuple2.of(a, b)]!!, op2Compiled[Tuple2.of(a, b)]!!)) } } return ret.flatten().toMap() @@ -208,7 +213,7 @@ class Pattern2ExprCompiler : GraphPatternCompiler, Map - Pair(Tuple1.of(a), And(op1Compiled[Tuple1.of(a)], op2Compiled[Tuple1.of(a)])) + Pair(Tuple1.of(a), And(op1Compiled[Tuple1.of(a)]!!, op2Compiled[Tuple1.of(a)]!!)) } return ret.toMap() } @@ -217,7 +222,7 @@ class Pattern2ExprCompiler : GraphPatternCompiler, Map - events.map { b -> Pair(Tuple2.of(a, b), checkNotNull(opCompiled[Tuple2.of(b, a)])) } + events.map { b -> Pair(Tuple2.of(a, b), opCompiled[Tuple2.of(b, a)]!!) } } .flatten() .toMap() @@ -227,7 +232,7 @@ class Pattern2ExprCompiler : GraphPatternCompiler, Map Pair(Tuple1.of(a), Or(events.map { b -> opCompiled[Tuple2.of(a, b)] })) } + events.map { a -> Pair(Tuple1.of(a), Or(events.map { b -> opCompiled[Tuple2.of(a, b)]!! })) } return ret.toMap() } @@ -261,17 +266,17 @@ class Pattern2ExprCompiler : GraphPatternCompiler, Map Iff( Or( - opCompiled[Tuple2.of(a, b)], + opCompiled[Tuple2.of(a, b)]!!, Or( events.map { c -> Or( - And(opCompiled[Tuple2.of(a, c)], checkNotNull(consts[Tuple2.of(c, b)]).ref), - And(checkNotNull(consts[Tuple2.of(a, c)]).ref, opCompiled[Tuple2.of(c, b)]), + And(opCompiled[Tuple2.of(a, c)]!!, consts[Tuple2.of(c, b)]!!.ref), + And(consts[Tuple2.of(a, c)]!!.ref, opCompiled[Tuple2.of(c, b)]!!), ) } ), ), - checkNotNull(consts[Tuple2.of(a, b)]).ref, + consts[Tuple2.of(a, b)]!!.ref, ) } } @@ -281,7 +286,7 @@ class Pattern2ExprCompiler : GraphPatternCompiler, Map events.map { b -> - Pair(Tuple2.of(a, b), if (a == b) True() else checkNotNull(consts[Tuple2.of(a, b)]).ref) + Pair(Tuple2.of(a, b), if (a == b) True() else consts[Tuple2.of(a, b)]!!.ref) } } return ret.flatten().toMap() @@ -301,7 +306,7 @@ class Pattern2ExprCompiler : GraphPatternCompiler, Map a != c && b != c } - .map { c -> And(op1Compiled[Tuple2.of(a, c)], op2Compiled[Tuple2.of(c, b)]) } + .map { c -> And(op1Compiled[Tuple2.of(a, c)]!!, op2Compiled[Tuple2.of(c, b)]!!) } ), ) } @@ -314,7 +319,7 @@ class Pattern2ExprCompiler : GraphPatternCompiler, Map events.map { b -> - Pair(Tuple2.of(a, b), if (a == b) checkNotNull(opCompiled[Tuple1.of(a)]) else False()) + Pair(Tuple2.of(a, b), if (a == b) opCompiled[Tuple1.of(a)]!! else False()) } } return ret.flatten().toMap() @@ -350,25 +355,25 @@ class Pattern2ExprCompiler : GraphPatternCompiler, Map Iff( Or( - opCompiled[Tuple2.of(a, b)], + opCompiled[Tuple2.of(a, b)]!!, Or( events .filter { c -> a != c && b != c } .map { c -> Or( And( - opCompiled[Tuple2.of(a, c)], - checkNotNull(consts[Tuple2.of(c, b)]).ref, + opCompiled[Tuple2.of(a, c)]!!, + consts[Tuple2.of(c, b)]!!.ref, ), And( - checkNotNull(consts[Tuple2.of(a, c)]).ref, - opCompiled[Tuple2.of(c, b)], + consts[Tuple2.of(a, c)]!!.ref, + opCompiled[Tuple2.of(c, b)]!!, ), ) } ), ), - checkNotNull(consts[Tuple2.of(a, b)]).ref, + consts[Tuple2.of(a, b)]!!.ref, ) } } @@ -377,7 +382,7 @@ class Pattern2ExprCompiler : GraphPatternCompiler, Map - events.map { b -> Pair(Tuple2.of(a, b), checkNotNull(consts[Tuple2.of(a, b)]).ref) } + events.map { b -> Pair(Tuple2.of(a, b), consts[Tuple2.of(a, b)]!!.ref) } } return ret.flatten().toMap() } @@ -389,7 +394,7 @@ class Pattern2ExprCompiler : GraphPatternCompiler, Map events.map { b -> - Pair(Tuple2.of(a, b), Or(op1Compiled[Tuple2.of(a, b)], op2Compiled[Tuple2.of(a, b)])) + Pair(Tuple2.of(a, b), Or(op1Compiled[Tuple2.of(a, b)]!!, op2Compiled[Tuple2.of(a, b)]!!)) } } return ret.flatten().toMap() @@ -401,7 +406,7 @@ class Pattern2ExprCompiler : GraphPatternCompiler, Map - Pair(Tuple1.of(a), And(op1Compiled[Tuple1.of(a)], op2Compiled[Tuple1.of(a)])) + Pair(Tuple1.of(a), And(op1Compiled[Tuple1.of(a)]!!, op2Compiled[Tuple1.of(a)]!!)) } return ret.toMap() } diff --git a/subprojects/solver/solver-javasmt/src/main/java/hu/bme/mit/theta/solver/javasmt/JavaSMTExprTransformer.java b/subprojects/solver/solver-javasmt/src/main/java/hu/bme/mit/theta/solver/javasmt/JavaSMTExprTransformer.java index 2fb06b2417..2b935377c9 100644 --- a/subprojects/solver/solver-javasmt/src/main/java/hu/bme/mit/theta/solver/javasmt/JavaSMTExprTransformer.java +++ b/subprojects/solver/solver-javasmt/src/main/java/hu/bme/mit/theta/solver/javasmt/JavaSMTExprTransformer.java @@ -15,10 +15,6 @@ */ package hu.bme.mit.theta.solver.javasmt; -import static com.google.common.base.Preconditions.checkState; -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; -import static hu.bme.mit.theta.core.utils.ExprUtils.extractFuncAndArgs; - import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import hu.bme.mit.theta.common.DispatchTable; @@ -34,148 +30,35 @@ import hu.bme.mit.theta.core.type.anytype.Dereference; import hu.bme.mit.theta.core.type.anytype.IteExpr; import hu.bme.mit.theta.core.type.anytype.RefExpr; -import hu.bme.mit.theta.core.type.arraytype.ArrayEqExpr; -import hu.bme.mit.theta.core.type.arraytype.ArrayInitExpr; -import hu.bme.mit.theta.core.type.arraytype.ArrayLitExpr; -import hu.bme.mit.theta.core.type.arraytype.ArrayNeqExpr; -import hu.bme.mit.theta.core.type.arraytype.ArrayReadExpr; -import hu.bme.mit.theta.core.type.arraytype.ArrayWriteExpr; -import hu.bme.mit.theta.core.type.booltype.AndExpr; -import hu.bme.mit.theta.core.type.booltype.ExistsExpr; -import hu.bme.mit.theta.core.type.booltype.FalseExpr; -import hu.bme.mit.theta.core.type.booltype.ForallExpr; -import hu.bme.mit.theta.core.type.booltype.IffExpr; -import hu.bme.mit.theta.core.type.booltype.ImplyExpr; -import hu.bme.mit.theta.core.type.booltype.NotExpr; -import hu.bme.mit.theta.core.type.booltype.OrExpr; -import hu.bme.mit.theta.core.type.booltype.TrueExpr; -import hu.bme.mit.theta.core.type.booltype.XorExpr; -import hu.bme.mit.theta.core.type.bvtype.BvAddExpr; -import hu.bme.mit.theta.core.type.bvtype.BvAndExpr; -import hu.bme.mit.theta.core.type.bvtype.BvArithShiftRightExpr; -import hu.bme.mit.theta.core.type.bvtype.BvConcatExpr; -import hu.bme.mit.theta.core.type.bvtype.BvEqExpr; -import hu.bme.mit.theta.core.type.bvtype.BvExtractExpr; -import hu.bme.mit.theta.core.type.bvtype.BvLitExpr; -import hu.bme.mit.theta.core.type.bvtype.BvLogicShiftRightExpr; -import hu.bme.mit.theta.core.type.bvtype.BvMulExpr; -import hu.bme.mit.theta.core.type.bvtype.BvNegExpr; -import hu.bme.mit.theta.core.type.bvtype.BvNeqExpr; -import hu.bme.mit.theta.core.type.bvtype.BvNotExpr; -import hu.bme.mit.theta.core.type.bvtype.BvOrExpr; -import hu.bme.mit.theta.core.type.bvtype.BvPosExpr; -import hu.bme.mit.theta.core.type.bvtype.BvRotateLeftExpr; -import hu.bme.mit.theta.core.type.bvtype.BvRotateRightExpr; -import hu.bme.mit.theta.core.type.bvtype.BvSDivExpr; -import hu.bme.mit.theta.core.type.bvtype.BvSExtExpr; -import hu.bme.mit.theta.core.type.bvtype.BvSGeqExpr; -import hu.bme.mit.theta.core.type.bvtype.BvSGtExpr; -import hu.bme.mit.theta.core.type.bvtype.BvSLeqExpr; -import hu.bme.mit.theta.core.type.bvtype.BvSLtExpr; -import hu.bme.mit.theta.core.type.bvtype.BvSModExpr; -import hu.bme.mit.theta.core.type.bvtype.BvSRemExpr; -import hu.bme.mit.theta.core.type.bvtype.BvShiftLeftExpr; -import hu.bme.mit.theta.core.type.bvtype.BvSignChangeExpr; -import hu.bme.mit.theta.core.type.bvtype.BvSubExpr; -import hu.bme.mit.theta.core.type.bvtype.BvUDivExpr; -import hu.bme.mit.theta.core.type.bvtype.BvUGeqExpr; -import hu.bme.mit.theta.core.type.bvtype.BvUGtExpr; -import hu.bme.mit.theta.core.type.bvtype.BvULeqExpr; -import hu.bme.mit.theta.core.type.bvtype.BvULtExpr; -import hu.bme.mit.theta.core.type.bvtype.BvURemExpr; -import hu.bme.mit.theta.core.type.bvtype.BvXorExpr; -import hu.bme.mit.theta.core.type.bvtype.BvZExtExpr; +import hu.bme.mit.theta.core.type.arraytype.*; +import hu.bme.mit.theta.core.type.booltype.*; +import hu.bme.mit.theta.core.type.bvtype.*; import hu.bme.mit.theta.core.type.enumtype.EnumEqExpr; import hu.bme.mit.theta.core.type.enumtype.EnumLitExpr; import hu.bme.mit.theta.core.type.enumtype.EnumNeqExpr; import hu.bme.mit.theta.core.type.enumtype.EnumType; -import hu.bme.mit.theta.core.type.fptype.FpAbsExpr; -import hu.bme.mit.theta.core.type.fptype.FpAddExpr; -import hu.bme.mit.theta.core.type.fptype.FpAssignExpr; -import hu.bme.mit.theta.core.type.fptype.FpDivExpr; -import hu.bme.mit.theta.core.type.fptype.FpEqExpr; -import hu.bme.mit.theta.core.type.fptype.FpFromBvExpr; -import hu.bme.mit.theta.core.type.fptype.FpGeqExpr; -import hu.bme.mit.theta.core.type.fptype.FpGtExpr; -import hu.bme.mit.theta.core.type.fptype.FpIsInfiniteExpr; -import hu.bme.mit.theta.core.type.fptype.FpIsNanExpr; -import hu.bme.mit.theta.core.type.fptype.FpLeqExpr; -import hu.bme.mit.theta.core.type.fptype.FpLitExpr; -import hu.bme.mit.theta.core.type.fptype.FpLtExpr; -import hu.bme.mit.theta.core.type.fptype.FpMaxExpr; -import hu.bme.mit.theta.core.type.fptype.FpMinExpr; -import hu.bme.mit.theta.core.type.fptype.FpMulExpr; -import hu.bme.mit.theta.core.type.fptype.FpNegExpr; -import hu.bme.mit.theta.core.type.fptype.FpNeqExpr; -import hu.bme.mit.theta.core.type.fptype.FpPosExpr; -import hu.bme.mit.theta.core.type.fptype.FpRemExpr; -import hu.bme.mit.theta.core.type.fptype.FpRoundToIntegralExpr; -import hu.bme.mit.theta.core.type.fptype.FpRoundingMode; -import hu.bme.mit.theta.core.type.fptype.FpSqrtExpr; -import hu.bme.mit.theta.core.type.fptype.FpSubExpr; -import hu.bme.mit.theta.core.type.fptype.FpToBvExpr; -import hu.bme.mit.theta.core.type.fptype.FpToFpExpr; +import hu.bme.mit.theta.core.type.fptype.*; import hu.bme.mit.theta.core.type.functype.FuncAppExpr; import hu.bme.mit.theta.core.type.functype.FuncType; -import hu.bme.mit.theta.core.type.inttype.IntAddExpr; -import hu.bme.mit.theta.core.type.inttype.IntDivExpr; -import hu.bme.mit.theta.core.type.inttype.IntEqExpr; -import hu.bme.mit.theta.core.type.inttype.IntGeqExpr; -import hu.bme.mit.theta.core.type.inttype.IntGtExpr; -import hu.bme.mit.theta.core.type.inttype.IntLeqExpr; -import hu.bme.mit.theta.core.type.inttype.IntLitExpr; -import hu.bme.mit.theta.core.type.inttype.IntLtExpr; -import hu.bme.mit.theta.core.type.inttype.IntModExpr; -import hu.bme.mit.theta.core.type.inttype.IntMulExpr; -import hu.bme.mit.theta.core.type.inttype.IntNegExpr; -import hu.bme.mit.theta.core.type.inttype.IntNeqExpr; -import hu.bme.mit.theta.core.type.inttype.IntPosExpr; -import hu.bme.mit.theta.core.type.inttype.IntRemExpr; -import hu.bme.mit.theta.core.type.inttype.IntSubExpr; -import hu.bme.mit.theta.core.type.inttype.IntToRatExpr; -import hu.bme.mit.theta.core.type.rattype.RatAddExpr; -import hu.bme.mit.theta.core.type.rattype.RatDivExpr; -import hu.bme.mit.theta.core.type.rattype.RatEqExpr; -import hu.bme.mit.theta.core.type.rattype.RatGeqExpr; -import hu.bme.mit.theta.core.type.rattype.RatGtExpr; -import hu.bme.mit.theta.core.type.rattype.RatLeqExpr; -import hu.bme.mit.theta.core.type.rattype.RatLitExpr; -import hu.bme.mit.theta.core.type.rattype.RatLtExpr; -import hu.bme.mit.theta.core.type.rattype.RatMulExpr; -import hu.bme.mit.theta.core.type.rattype.RatNegExpr; -import hu.bme.mit.theta.core.type.rattype.RatNeqExpr; -import hu.bme.mit.theta.core.type.rattype.RatPosExpr; -import hu.bme.mit.theta.core.type.rattype.RatSubExpr; -import hu.bme.mit.theta.core.type.rattype.RatToIntExpr; +import hu.bme.mit.theta.core.type.inttype.*; +import hu.bme.mit.theta.core.type.rattype.*; import hu.bme.mit.theta.core.utils.BvUtils; +import kotlin.Pair; +import org.sosy_lab.java_smt.api.*; +import org.sosy_lab.java_smt.api.FormulaType.FloatingPointType; +import org.sosy_lab.java_smt.api.NumeralFormula.IntegerFormula; +import org.sosy_lab.java_smt.api.NumeralFormula.RationalFormula; + import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutionException; import java.util.function.Supplier; import java.util.stream.Collectors; import java.util.stream.Stream; -import org.sosy_lab.java_smt.api.ArrayFormula; -import org.sosy_lab.java_smt.api.ArrayFormulaManager; -import org.sosy_lab.java_smt.api.BitvectorFormula; -import org.sosy_lab.java_smt.api.BitvectorFormulaManager; -import org.sosy_lab.java_smt.api.BooleanFormula; -import org.sosy_lab.java_smt.api.BooleanFormulaManager; -import org.sosy_lab.java_smt.api.EnumerationFormula; -import org.sosy_lab.java_smt.api.EnumerationFormulaManager; -import org.sosy_lab.java_smt.api.FloatingPointFormula; -import org.sosy_lab.java_smt.api.FloatingPointFormulaManager; -import org.sosy_lab.java_smt.api.FloatingPointRoundingMode; -import org.sosy_lab.java_smt.api.Formula; -import org.sosy_lab.java_smt.api.FormulaType; -import org.sosy_lab.java_smt.api.FormulaType.FloatingPointType; -import org.sosy_lab.java_smt.api.FunctionDeclaration; -import org.sosy_lab.java_smt.api.IntegerFormulaManager; -import org.sosy_lab.java_smt.api.NumeralFormula; -import org.sosy_lab.java_smt.api.NumeralFormula.IntegerFormula; -import org.sosy_lab.java_smt.api.NumeralFormula.RationalFormula; -import org.sosy_lab.java_smt.api.QuantifiedFormulaManager; -import org.sosy_lab.java_smt.api.RationalFormulaManager; -import org.sosy_lab.java_smt.api.SolverContext; + +import static com.google.common.base.Preconditions.checkNotNull; +import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; +import static hu.bme.mit.theta.core.utils.ExprUtils.extractFuncAndArgs; final class JavaSMTExprTransformer { @@ -389,12 +272,11 @@ private static FloatingPointRoundingMode transformRoundingMode( }; } - //// + /// / /* * General */ - public Formula toTerm(final Expr expr) { try { return exprToTerm.get(expr, () -> table.dispatch(expr)); @@ -1176,9 +1058,9 @@ private Formula transformArrayLit( final FormulaType indexType = (FormulaType) transformer.toSort(expr.getType().getIndexType()); var arr = arrayFormulaManager.makeArray(elseElem, indexType, elemType); - for (Tuple2, ? extends LitExpr> element : expr.getElements()) { - final TI index = (TI) toTerm(element.get1()); - final TE elem = (TE) toTerm(element.get2()); + for (Pair, ? extends LitExpr> element : expr.getElements()) { + final TI index = (TI) toTerm(element.getFirst()); + final TE elem = (TE) toTerm(element.getSecond()); arr = arrayFormulaManager.store(arr, index, elem); } return arr; @@ -1196,9 +1078,9 @@ private Formula transformArrayInit( final FormulaType indexType = (FormulaType) transformer.toSort(expr.getType().getIndexType()); var arr = arrayFormulaManager.makeArray(elseElem, indexType, elemType); - for (Tuple2, ? extends Expr> element : expr.getElements()) { - final TI index = (TI) toTerm(element.get1()); - final TE elem = (TE) toTerm(element.get2()); + for (Pair, ? extends Expr> element : expr.getElements()) { + final TI index = (TI) toTerm(element.getFirst()); + final TE elem = (TE) toTerm(element.getSecond()); arr = arrayFormulaManager.store(arr, index, elem); } return arr; @@ -1240,8 +1122,8 @@ private Formula transformFuncApp(final FuncAppExpr expr) { } private Formula transformDereference(final Dereference expr) { - checkState( - expr.getUniquenessIdx().isPresent(), + checkNotNull( + expr.getUniquenessIdx(), "Incomplete dereferences (missing uniquenessIdx) are not handled properly."); final var sort = transformer.toSort(expr.getArray().getType()); final var sortName = expr.getArray().getType().toString() + "-" + expr.getType().toString(); @@ -1261,7 +1143,7 @@ private Formula transformDereference(final Dereference expr) { funcDecl, toTerm(expr.getArray()), toTerm(expr.getOffset()), - toTerm(expr.getUniquenessIdx().get())); + toTerm(expr.getUniquenessIdx())); return func; } diff --git a/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/generic/GenericSmtLibExprTransformer.java b/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/generic/GenericSmtLibExprTransformer.java index cc8cc81545..bccaff6243 100644 --- a/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/generic/GenericSmtLibExprTransformer.java +++ b/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/generic/GenericSmtLibExprTransformer.java @@ -15,9 +15,6 @@ */ package hu.bme.mit.theta.solver.smtlib.impl.generic; -import static com.google.common.base.Preconditions.checkState; -import static hu.bme.mit.theta.core.utils.ExprUtils.extractFuncAndArgs; - import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import hu.bme.mit.theta.common.DispatchTable; @@ -32,130 +29,34 @@ import hu.bme.mit.theta.core.type.anytype.Dereference; import hu.bme.mit.theta.core.type.anytype.IteExpr; import hu.bme.mit.theta.core.type.anytype.RefExpr; -import hu.bme.mit.theta.core.type.arraytype.ArrayEqExpr; -import hu.bme.mit.theta.core.type.arraytype.ArrayInitExpr; -import hu.bme.mit.theta.core.type.arraytype.ArrayLitExpr; -import hu.bme.mit.theta.core.type.arraytype.ArrayNeqExpr; -import hu.bme.mit.theta.core.type.arraytype.ArrayReadExpr; -import hu.bme.mit.theta.core.type.arraytype.ArrayWriteExpr; -import hu.bme.mit.theta.core.type.booltype.AndExpr; -import hu.bme.mit.theta.core.type.booltype.ExistsExpr; -import hu.bme.mit.theta.core.type.booltype.FalseExpr; -import hu.bme.mit.theta.core.type.booltype.ForallExpr; -import hu.bme.mit.theta.core.type.booltype.IffExpr; -import hu.bme.mit.theta.core.type.booltype.ImplyExpr; -import hu.bme.mit.theta.core.type.booltype.NotExpr; -import hu.bme.mit.theta.core.type.booltype.OrExpr; -import hu.bme.mit.theta.core.type.booltype.TrueExpr; -import hu.bme.mit.theta.core.type.booltype.XorExpr; -import hu.bme.mit.theta.core.type.bvtype.BvAddExpr; -import hu.bme.mit.theta.core.type.bvtype.BvAndExpr; -import hu.bme.mit.theta.core.type.bvtype.BvArithShiftRightExpr; -import hu.bme.mit.theta.core.type.bvtype.BvConcatExpr; -import hu.bme.mit.theta.core.type.bvtype.BvEqExpr; -import hu.bme.mit.theta.core.type.bvtype.BvExtractExpr; -import hu.bme.mit.theta.core.type.bvtype.BvLitExpr; -import hu.bme.mit.theta.core.type.bvtype.BvLogicShiftRightExpr; -import hu.bme.mit.theta.core.type.bvtype.BvMulExpr; -import hu.bme.mit.theta.core.type.bvtype.BvNegExpr; -import hu.bme.mit.theta.core.type.bvtype.BvNeqExpr; -import hu.bme.mit.theta.core.type.bvtype.BvNotExpr; -import hu.bme.mit.theta.core.type.bvtype.BvOrExpr; -import hu.bme.mit.theta.core.type.bvtype.BvPosExpr; -import hu.bme.mit.theta.core.type.bvtype.BvRotateLeftExpr; -import hu.bme.mit.theta.core.type.bvtype.BvRotateRightExpr; -import hu.bme.mit.theta.core.type.bvtype.BvSDivExpr; -import hu.bme.mit.theta.core.type.bvtype.BvSExtExpr; -import hu.bme.mit.theta.core.type.bvtype.BvSGeqExpr; -import hu.bme.mit.theta.core.type.bvtype.BvSGtExpr; -import hu.bme.mit.theta.core.type.bvtype.BvSLeqExpr; -import hu.bme.mit.theta.core.type.bvtype.BvSLtExpr; -import hu.bme.mit.theta.core.type.bvtype.BvSModExpr; -import hu.bme.mit.theta.core.type.bvtype.BvSRemExpr; -import hu.bme.mit.theta.core.type.bvtype.BvShiftLeftExpr; -import hu.bme.mit.theta.core.type.bvtype.BvSignChangeExpr; -import hu.bme.mit.theta.core.type.bvtype.BvSubExpr; -import hu.bme.mit.theta.core.type.bvtype.BvUDivExpr; -import hu.bme.mit.theta.core.type.bvtype.BvUGeqExpr; -import hu.bme.mit.theta.core.type.bvtype.BvUGtExpr; -import hu.bme.mit.theta.core.type.bvtype.BvULeqExpr; -import hu.bme.mit.theta.core.type.bvtype.BvULtExpr; -import hu.bme.mit.theta.core.type.bvtype.BvURemExpr; -import hu.bme.mit.theta.core.type.bvtype.BvXorExpr; -import hu.bme.mit.theta.core.type.bvtype.BvZExtExpr; +import hu.bme.mit.theta.core.type.arraytype.*; +import hu.bme.mit.theta.core.type.booltype.*; +import hu.bme.mit.theta.core.type.bvtype.*; import hu.bme.mit.theta.core.type.enumtype.EnumEqExpr; import hu.bme.mit.theta.core.type.enumtype.EnumLitExpr; import hu.bme.mit.theta.core.type.enumtype.EnumNeqExpr; import hu.bme.mit.theta.core.type.enumtype.EnumType; -import hu.bme.mit.theta.core.type.fptype.FpAbsExpr; -import hu.bme.mit.theta.core.type.fptype.FpAddExpr; -import hu.bme.mit.theta.core.type.fptype.FpAssignExpr; -import hu.bme.mit.theta.core.type.fptype.FpDivExpr; -import hu.bme.mit.theta.core.type.fptype.FpEqExpr; -import hu.bme.mit.theta.core.type.fptype.FpFromBvExpr; -import hu.bme.mit.theta.core.type.fptype.FpGeqExpr; -import hu.bme.mit.theta.core.type.fptype.FpGtExpr; -import hu.bme.mit.theta.core.type.fptype.FpIsInfiniteExpr; -import hu.bme.mit.theta.core.type.fptype.FpIsNanExpr; -import hu.bme.mit.theta.core.type.fptype.FpLeqExpr; -import hu.bme.mit.theta.core.type.fptype.FpLitExpr; -import hu.bme.mit.theta.core.type.fptype.FpLtExpr; -import hu.bme.mit.theta.core.type.fptype.FpMaxExpr; -import hu.bme.mit.theta.core.type.fptype.FpMinExpr; -import hu.bme.mit.theta.core.type.fptype.FpMulExpr; -import hu.bme.mit.theta.core.type.fptype.FpNegExpr; -import hu.bme.mit.theta.core.type.fptype.FpNeqExpr; -import hu.bme.mit.theta.core.type.fptype.FpPosExpr; -import hu.bme.mit.theta.core.type.fptype.FpRemExpr; -import hu.bme.mit.theta.core.type.fptype.FpRoundToIntegralExpr; -import hu.bme.mit.theta.core.type.fptype.FpRoundingMode; -import hu.bme.mit.theta.core.type.fptype.FpSqrtExpr; -import hu.bme.mit.theta.core.type.fptype.FpSubExpr; -import hu.bme.mit.theta.core.type.fptype.FpToBvExpr; -import hu.bme.mit.theta.core.type.fptype.FpToFpExpr; +import hu.bme.mit.theta.core.type.fptype.*; import hu.bme.mit.theta.core.type.functype.FuncAppExpr; import hu.bme.mit.theta.core.type.functype.FuncLitExpr; import hu.bme.mit.theta.core.type.functype.FuncType; -import hu.bme.mit.theta.core.type.inttype.IntAddExpr; -import hu.bme.mit.theta.core.type.inttype.IntDivExpr; -import hu.bme.mit.theta.core.type.inttype.IntEqExpr; -import hu.bme.mit.theta.core.type.inttype.IntGeqExpr; -import hu.bme.mit.theta.core.type.inttype.IntGtExpr; -import hu.bme.mit.theta.core.type.inttype.IntLeqExpr; -import hu.bme.mit.theta.core.type.inttype.IntLitExpr; -import hu.bme.mit.theta.core.type.inttype.IntLtExpr; -import hu.bme.mit.theta.core.type.inttype.IntModExpr; -import hu.bme.mit.theta.core.type.inttype.IntMulExpr; -import hu.bme.mit.theta.core.type.inttype.IntNegExpr; -import hu.bme.mit.theta.core.type.inttype.IntNeqExpr; -import hu.bme.mit.theta.core.type.inttype.IntPosExpr; -import hu.bme.mit.theta.core.type.inttype.IntRemExpr; -import hu.bme.mit.theta.core.type.inttype.IntSubExpr; -import hu.bme.mit.theta.core.type.inttype.IntToRatExpr; -import hu.bme.mit.theta.core.type.rattype.RatAddExpr; -import hu.bme.mit.theta.core.type.rattype.RatDivExpr; -import hu.bme.mit.theta.core.type.rattype.RatEqExpr; -import hu.bme.mit.theta.core.type.rattype.RatGeqExpr; -import hu.bme.mit.theta.core.type.rattype.RatGtExpr; -import hu.bme.mit.theta.core.type.rattype.RatLeqExpr; -import hu.bme.mit.theta.core.type.rattype.RatLitExpr; -import hu.bme.mit.theta.core.type.rattype.RatLtExpr; -import hu.bme.mit.theta.core.type.rattype.RatMulExpr; -import hu.bme.mit.theta.core.type.rattype.RatNegExpr; -import hu.bme.mit.theta.core.type.rattype.RatNeqExpr; -import hu.bme.mit.theta.core.type.rattype.RatPosExpr; -import hu.bme.mit.theta.core.type.rattype.RatSubExpr; -import hu.bme.mit.theta.core.type.rattype.RatToIntExpr; +import hu.bme.mit.theta.core.type.inttype.*; +import hu.bme.mit.theta.core.type.rattype.*; import hu.bme.mit.theta.core.utils.BvUtils; import hu.bme.mit.theta.core.utils.ExprUtils; import hu.bme.mit.theta.solver.smtlib.solver.transformer.SmtLibExprTransformer; import hu.bme.mit.theta.solver.smtlib.solver.transformer.SmtLibSymbolTable; import hu.bme.mit.theta.solver.smtlib.solver.transformer.SmtLibTransformationManager; +import kotlin.Pair; + import java.math.BigInteger; import java.util.List; import java.util.Map; import java.util.concurrent.ExecutionException; +import static com.google.common.base.Preconditions.checkNotNull; +import static hu.bme.mit.theta.core.utils.ExprUtils.extractFuncAndArgs; + public class GenericSmtLibExprTransformer implements SmtLibExprTransformer { private static final int CACHE_SIZE = 1000; @@ -1172,10 +1073,10 @@ protected String transformArrayLit(final ArrayLitExpr expr) { String.format( "((as const %s) %s)", transformer.toSort(expr.getType()), toTerm(expr.getElseElem())); - for (Tuple2, ? extends Expr> elem : expr.getElements()) { + for (Pair, ? extends Expr> elem : expr.getElements()) { running = String.format( - "(store %s %s %s)", running, toTerm(elem.get1()), toTerm(elem.get2())); + "(store %s %s %s)", running, toTerm(elem.getFirst()), toTerm(elem.getSecond())); } return running; } @@ -1185,22 +1086,22 @@ protected String transformArrayInit(final ArrayInitExpr expr) { String.format( "((as const %s) %s)", transformer.toSort(expr.getType()), toTerm(expr.getElseElem())); - for (Tuple2, ? extends Expr> elem : expr.getElements()) { + for (Pair, ? extends Expr> elem : expr.getElements()) { running = String.format( - "(store %s %s %s)", running, toTerm(elem.get1()), toTerm(elem.get2())); + "(store %s %s %s)", running, toTerm(elem.getFirst()), toTerm(elem.getSecond())); } return running; } private String transformDereference(final Dereference expr) { - checkState( - expr.getUniquenessIdx().isPresent(), + checkNotNull( + expr.getUniquenessIdx(), "Incomplete dereferences (missing uniquenessIdx) are not handled properly."); return "(deref %s %s %s)" .formatted( toTerm(expr.getArray()), toTerm(expr.getOffset()), - toTerm(expr.getUniquenessIdx().get())); + toTerm(expr.getUniquenessIdx())); } } diff --git a/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/generic/GenericSmtLibTermTransformer.java b/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/generic/GenericSmtLibTermTransformer.java index c500700589..316499e4c8 100644 --- a/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/generic/GenericSmtLibTermTransformer.java +++ b/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/generic/GenericSmtLibTermTransformer.java @@ -15,120 +15,25 @@ */ package hu.bme.mit.theta.solver.smtlib.impl.generic; -import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.base.Preconditions.checkNotNull; -import static hu.bme.mit.theta.core.decl.Decls.Const; -import static hu.bme.mit.theta.core.decl.Decls.Param; -import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.Array; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Exists; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Forall; -import static hu.bme.mit.theta.core.type.functype.FuncExprs.Func; -import static hu.bme.mit.theta.core.type.functype.FuncExprs.UnsafeApp; -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; -import static hu.bme.mit.theta.core.type.rattype.RatExprs.Rat; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; -import static hu.bme.mit.theta.core.utils.TypeUtils.castBv; -import static hu.bme.mit.theta.solver.smtlib.dsl.gen.SMTLIBv2Parser.BinaryContext; -import static hu.bme.mit.theta.solver.smtlib.dsl.gen.SMTLIBv2Parser.DecimalContext; -import static hu.bme.mit.theta.solver.smtlib.dsl.gen.SMTLIBv2Parser.Exists_termContext; -import static hu.bme.mit.theta.solver.smtlib.dsl.gen.SMTLIBv2Parser.Forall_termContext; -import static hu.bme.mit.theta.solver.smtlib.dsl.gen.SMTLIBv2Parser.Generic_termContext; -import static hu.bme.mit.theta.solver.smtlib.dsl.gen.SMTLIBv2Parser.HexadecimalContext; -import static hu.bme.mit.theta.solver.smtlib.dsl.gen.SMTLIBv2Parser.IdentifierContext; -import static hu.bme.mit.theta.solver.smtlib.dsl.gen.SMTLIBv2Parser.IndexContext; -import static hu.bme.mit.theta.solver.smtlib.dsl.gen.SMTLIBv2Parser.Let_termContext; -import static hu.bme.mit.theta.solver.smtlib.dsl.gen.SMTLIBv2Parser.NumeralContext; -import static hu.bme.mit.theta.solver.smtlib.dsl.gen.SMTLIBv2Parser.Qual_identifierContext; -import static hu.bme.mit.theta.solver.smtlib.dsl.gen.SMTLIBv2Parser.SortContext; -import static hu.bme.mit.theta.solver.smtlib.dsl.gen.SMTLIBv2Parser.Spec_constantContext; -import static hu.bme.mit.theta.solver.smtlib.dsl.gen.SMTLIBv2Parser.SymbolContext; -import static hu.bme.mit.theta.solver.smtlib.dsl.gen.SMTLIBv2Parser.TermContext; -import static java.util.stream.Collectors.toList; - import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; import hu.bme.mit.theta.common.QuadFunction; import hu.bme.mit.theta.common.TernaryOperator; import hu.bme.mit.theta.common.TriFunction; -import hu.bme.mit.theta.common.Tuple2; import hu.bme.mit.theta.core.decl.ParamDecl; import hu.bme.mit.theta.core.model.BasicSubstitution; import hu.bme.mit.theta.core.type.Expr; import hu.bme.mit.theta.core.type.LitExpr; import hu.bme.mit.theta.core.type.Type; -import hu.bme.mit.theta.core.type.abstracttype.AddExpr; -import hu.bme.mit.theta.core.type.abstracttype.EqExpr; -import hu.bme.mit.theta.core.type.abstracttype.GeqExpr; -import hu.bme.mit.theta.core.type.abstracttype.GtExpr; -import hu.bme.mit.theta.core.type.abstracttype.LeqExpr; -import hu.bme.mit.theta.core.type.abstracttype.LtExpr; -import hu.bme.mit.theta.core.type.abstracttype.ModExpr; -import hu.bme.mit.theta.core.type.abstracttype.MulExpr; -import hu.bme.mit.theta.core.type.abstracttype.NegExpr; -import hu.bme.mit.theta.core.type.abstracttype.RemExpr; -import hu.bme.mit.theta.core.type.abstracttype.SubExpr; +import hu.bme.mit.theta.core.type.abstracttype.*; import hu.bme.mit.theta.core.type.anytype.IteExpr; import hu.bme.mit.theta.core.type.arraytype.ArrayReadExpr; import hu.bme.mit.theta.core.type.arraytype.ArrayType; import hu.bme.mit.theta.core.type.arraytype.ArrayWriteExpr; -import hu.bme.mit.theta.core.type.booltype.AndExpr; -import hu.bme.mit.theta.core.type.booltype.BoolExprs; -import hu.bme.mit.theta.core.type.booltype.IffExpr; -import hu.bme.mit.theta.core.type.booltype.ImplyExpr; -import hu.bme.mit.theta.core.type.booltype.NotExpr; -import hu.bme.mit.theta.core.type.booltype.OrExpr; -import hu.bme.mit.theta.core.type.booltype.XorExpr; -import hu.bme.mit.theta.core.type.bvtype.BvAddExpr; -import hu.bme.mit.theta.core.type.bvtype.BvAndExpr; -import hu.bme.mit.theta.core.type.bvtype.BvArithShiftRightExpr; -import hu.bme.mit.theta.core.type.bvtype.BvConcatExpr; -import hu.bme.mit.theta.core.type.bvtype.BvExprs; -import hu.bme.mit.theta.core.type.bvtype.BvExtractExpr; -import hu.bme.mit.theta.core.type.bvtype.BvLitExpr; -import hu.bme.mit.theta.core.type.bvtype.BvLogicShiftRightExpr; -import hu.bme.mit.theta.core.type.bvtype.BvNegExpr; -import hu.bme.mit.theta.core.type.bvtype.BvNotExpr; -import hu.bme.mit.theta.core.type.bvtype.BvOrExpr; -import hu.bme.mit.theta.core.type.bvtype.BvSDivExpr; -import hu.bme.mit.theta.core.type.bvtype.BvSExtExpr; -import hu.bme.mit.theta.core.type.bvtype.BvSGeqExpr; -import hu.bme.mit.theta.core.type.bvtype.BvSGtExpr; -import hu.bme.mit.theta.core.type.bvtype.BvSLeqExpr; -import hu.bme.mit.theta.core.type.bvtype.BvSLtExpr; -import hu.bme.mit.theta.core.type.bvtype.BvSModExpr; -import hu.bme.mit.theta.core.type.bvtype.BvSRemExpr; -import hu.bme.mit.theta.core.type.bvtype.BvShiftLeftExpr; -import hu.bme.mit.theta.core.type.bvtype.BvSubExpr; -import hu.bme.mit.theta.core.type.bvtype.BvType; -import hu.bme.mit.theta.core.type.bvtype.BvUDivExpr; -import hu.bme.mit.theta.core.type.bvtype.BvUGeqExpr; -import hu.bme.mit.theta.core.type.bvtype.BvUGtExpr; -import hu.bme.mit.theta.core.type.bvtype.BvULeqExpr; -import hu.bme.mit.theta.core.type.bvtype.BvULtExpr; -import hu.bme.mit.theta.core.type.bvtype.BvURemExpr; -import hu.bme.mit.theta.core.type.bvtype.BvXorExpr; -import hu.bme.mit.theta.core.type.bvtype.BvZExtExpr; +import hu.bme.mit.theta.core.type.booltype.*; +import hu.bme.mit.theta.core.type.bvtype.*; import hu.bme.mit.theta.core.type.enumtype.EnumType; -import hu.bme.mit.theta.core.type.fptype.FpAbsExpr; -import hu.bme.mit.theta.core.type.fptype.FpAddExpr; -import hu.bme.mit.theta.core.type.fptype.FpDivExpr; -import hu.bme.mit.theta.core.type.fptype.FpEqExpr; -import hu.bme.mit.theta.core.type.fptype.FpExprs; -import hu.bme.mit.theta.core.type.fptype.FpGeqExpr; -import hu.bme.mit.theta.core.type.fptype.FpGtExpr; -import hu.bme.mit.theta.core.type.fptype.FpIsNanExpr; -import hu.bme.mit.theta.core.type.fptype.FpLeqExpr; -import hu.bme.mit.theta.core.type.fptype.FpLtExpr; -import hu.bme.mit.theta.core.type.fptype.FpMaxExpr; -import hu.bme.mit.theta.core.type.fptype.FpMinExpr; -import hu.bme.mit.theta.core.type.fptype.FpMulExpr; -import hu.bme.mit.theta.core.type.fptype.FpNegExpr; -import hu.bme.mit.theta.core.type.fptype.FpRemExpr; -import hu.bme.mit.theta.core.type.fptype.FpRoundToIntegralExpr; -import hu.bme.mit.theta.core.type.fptype.FpRoundingMode; -import hu.bme.mit.theta.core.type.fptype.FpSqrtExpr; -import hu.bme.mit.theta.core.type.fptype.FpSubExpr; +import hu.bme.mit.theta.core.type.fptype.*; import hu.bme.mit.theta.core.type.functype.FuncLitExpr; import hu.bme.mit.theta.core.type.functype.FuncType; import hu.bme.mit.theta.core.type.inttype.IntDivExpr; @@ -147,21 +52,30 @@ import hu.bme.mit.theta.solver.smtlib.solver.parser.ThrowExceptionErrorListener; import hu.bme.mit.theta.solver.smtlib.solver.transformer.SmtLibSymbolTable; import hu.bme.mit.theta.solver.smtlib.solver.transformer.SmtLibTermTransformer; +import kotlin.Pair; +import org.antlr.v4.runtime.CharStreams; +import org.antlr.v4.runtime.CommonTokenStream; + import java.math.BigDecimal; import java.math.BigInteger; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.function.BiFunction; -import java.util.function.BinaryOperator; -import java.util.function.Function; -import java.util.function.Supplier; -import java.util.function.UnaryOperator; +import java.util.*; +import java.util.function.*; import java.util.stream.Collectors; -import org.antlr.v4.runtime.CharStreams; -import org.antlr.v4.runtime.CommonTokenStream; + +import static com.google.common.base.Preconditions.checkArgument; +import static com.google.common.base.Preconditions.checkNotNull; +import static hu.bme.mit.theta.core.decl.Decls.Const; +import static hu.bme.mit.theta.core.decl.Decls.Param; +import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.Array; +import static hu.bme.mit.theta.core.type.booltype.BoolExprs.*; +import static hu.bme.mit.theta.core.type.functype.FuncExprs.Func; +import static hu.bme.mit.theta.core.type.functype.FuncExprs.UnsafeApp; +import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; +import static hu.bme.mit.theta.core.type.rattype.RatExprs.Rat; +import static hu.bme.mit.theta.core.utils.TypeUtils.cast; +import static hu.bme.mit.theta.core.utils.TypeUtils.castBv; +import static hu.bme.mit.theta.solver.smtlib.dsl.gen.SMTLIBv2Parser.*; +import static java.util.stream.Collectors.toList; public class GenericSmtLibTermTransformer implements SmtLibTermTransformer { @@ -381,11 +295,11 @@ public LitExpr> toArrayLitExpr( return null; } else if (arrayLitExpr instanceof IteExpr) { final var entryExprsBuilder = - new ImmutableList.Builder, ? extends Expr>>(); + new ImmutableList.Builder, ? extends Expr>>(); var iteExpr = (IteExpr) arrayLitExpr; while (true) { entryExprsBuilder.add( - Tuple2.of((Expr) iteExpr.getCond().getOps().get(1), iteExpr.getThen())); + new Pair<>((Expr) iteExpr.getCond().getOps().get(1), iteExpr.getThen())); if (iteExpr.getElse() instanceof IteExpr) { iteExpr = (IteExpr) iteExpr.getElse(); } else { diff --git a/subprojects/solver/solver-z3-legacy/src/main/java/hu/bme/mit/theta/solver/z3legacy/Z3ExprTransformer.java b/subprojects/solver/solver-z3-legacy/src/main/java/hu/bme/mit/theta/solver/z3legacy/Z3ExprTransformer.java index f9841fda37..7e8a3c1b58 100644 --- a/subprojects/solver/solver-z3-legacy/src/main/java/hu/bme/mit/theta/solver/z3legacy/Z3ExprTransformer.java +++ b/subprojects/solver/solver-z3-legacy/src/main/java/hu/bme/mit/theta/solver/z3legacy/Z3ExprTransformer.java @@ -15,6 +15,7 @@ */ package hu.bme.mit.theta.solver.z3legacy; +import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkState; import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; import static hu.bme.mit.theta.core.utils.ExprUtils.extractFuncAndArgs; @@ -47,6 +48,8 @@ import hu.bme.mit.theta.core.type.inttype.*; import hu.bme.mit.theta.core.type.rattype.*; import hu.bme.mit.theta.core.utils.BvUtils; +import kotlin.Pair; + import java.util.List; import java.util.concurrent.ExecutionException; import java.util.stream.Stream; @@ -1030,8 +1033,8 @@ private com.microsoft.z3legacy.Expr transformArrayLit(final ArrayLitExpr e context.mkConstArray( transformer.toSort(expr.getType().getIndexType()), toTerm(expr.getElseElem())); - for (Tuple2, ? extends Expr> elem : expr.getElements()) { - running = context.mkStore(running, toTerm(elem.get1()), toTerm(elem.get2())); + for (Pair, ? extends Expr> elem : expr.getElements()) { + running = context.mkStore(running, toTerm(elem.getFirst()), toTerm(elem.getSecond())); } return running; } @@ -1041,8 +1044,8 @@ private com.microsoft.z3legacy.Expr transformArrayInit(final ArrayInitExpr context.mkConstArray( transformer.toSort(expr.getType().getIndexType()), toTerm(expr.getElseElem())); - for (Tuple2, ? extends Expr> elem : expr.getElements()) { - running = context.mkStore(running, toTerm(elem.get1()), toTerm(elem.get2())); + for (Pair, ? extends Expr> elem : expr.getElements()) { + running = context.mkStore(running, toTerm(elem.getFirst()), toTerm(elem.getSecond())); } return running; } @@ -1065,8 +1068,8 @@ private com.microsoft.z3legacy.Expr transformFuncApp(final FuncAppExpr exp } private com.microsoft.z3legacy.Expr transformDereference(final Dereference expr) { - checkState( - expr.getUniquenessIdx().isPresent(), + checkNotNull( + expr.getUniquenessIdx(), "Incomplete dereferences (missing uniquenessIdx) are not handled properly."); final var sort = transformer.toSort(expr.getArray().getType()); final var constSort = transformer.toSort(Int()); @@ -1079,7 +1082,7 @@ private com.microsoft.z3legacy.Expr transformDereference(final Dereference Expr createIndexValueArrayLitExpr( .map( entry -> { checkState(entry.get1().size() == 1); - return Tuple2.of( + return new Pair<>( (Expr) entry.get1().get(0), (Expr) entry.get2()); }) .collect(Collectors.toUnmodifiableList()), diff --git a/subprojects/solver/solver-z3/src/main/java/hu/bme/mit/theta/solver/z3/Z3ExprTransformer.java b/subprojects/solver/solver-z3/src/main/java/hu/bme/mit/theta/solver/z3/Z3ExprTransformer.java index ef8497d332..fd821bc99f 100644 --- a/subprojects/solver/solver-z3/src/main/java/hu/bme/mit/theta/solver/z3/Z3ExprTransformer.java +++ b/subprojects/solver/solver-z3/src/main/java/hu/bme/mit/theta/solver/z3/Z3ExprTransformer.java @@ -15,16 +15,9 @@ */ package hu.bme.mit.theta.solver.z3; -import static hu.bme.mit.theta.core.utils.ExprUtils.extractFuncAndArgs; - import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import com.microsoft.z3.*; -import com.microsoft.z3.BitVecExpr; -import com.microsoft.z3.BoolExpr; -import com.microsoft.z3.Context; -import com.microsoft.z3.FPExpr; -import com.microsoft.z3.FPSort; import hu.bme.mit.theta.common.DispatchTable; import hu.bme.mit.theta.common.Tuple2; import hu.bme.mit.theta.common.dsl.Env; @@ -51,11 +44,15 @@ import hu.bme.mit.theta.core.type.rattype.*; import hu.bme.mit.theta.core.utils.BvUtils; import hu.bme.mit.theta.core.utils.ExprUtils; +import kotlin.Pair; + import java.util.List; import java.util.Map; import java.util.concurrent.ExecutionException; import java.util.stream.Stream; +import static hu.bme.mit.theta.core.utils.ExprUtils.extractFuncAndArgs; + final class Z3ExprTransformer { private static final int CACHE_SIZE = 1000; @@ -1022,8 +1019,8 @@ private com.microsoft.z3.Expr transformArrayLit(final ArrayLitExpr expr) { context.mkConstArray( transformer.toSort(expr.getType().getIndexType()), toTerm(expr.getElseElem())); - for (Tuple2, ? extends Expr> elem : expr.getElements()) { - running = context.mkStore(running, toTerm(elem.get1()), toTerm(elem.get2())); + for (Pair, ? extends Expr> elem : expr.getElements()) { + running = context.mkStore(running, toTerm(elem.getFirst()), toTerm(elem.getSecond())); } return running; } @@ -1033,8 +1030,8 @@ private com.microsoft.z3.Expr transformArrayInit(final ArrayInitExpr expr) context.mkConstArray( transformer.toSort(expr.getType().getIndexType()), toTerm(expr.getElseElem())); - for (Tuple2, ? extends Expr> elem : expr.getElements()) { - running = context.mkStore(running, toTerm(elem.get1()), toTerm(elem.get2())); + for (Pair, ? extends Expr> elem : expr.getElements()) { + running = context.mkStore(running, toTerm(elem.getFirst()), toTerm(elem.getSecond())); } return running; } diff --git a/subprojects/solver/solver-z3/src/main/java/hu/bme/mit/theta/solver/z3/Z3TermTransformer.java b/subprojects/solver/solver-z3/src/main/java/hu/bme/mit/theta/solver/z3/Z3TermTransformer.java index d9357afd0c..68e5c04a44 100644 --- a/subprojects/solver/solver-z3/src/main/java/hu/bme/mit/theta/solver/z3/Z3TermTransformer.java +++ b/subprojects/solver/solver-z3/src/main/java/hu/bme/mit/theta/solver/z3/Z3TermTransformer.java @@ -15,33 +15,8 @@ */ package hu.bme.mit.theta.solver.z3; -import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.base.Preconditions.checkNotNull; -import static com.google.common.base.Preconditions.checkState; -import static com.google.common.collect.ImmutableList.toImmutableList; -import static hu.bme.mit.theta.common.Utils.head; -import static hu.bme.mit.theta.common.Utils.tail; -import static hu.bme.mit.theta.core.decl.Decls.Param; -import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.Array; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.And; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Exists; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Forall; -import static hu.bme.mit.theta.core.type.bvtype.BvExprs.BvType; -import static hu.bme.mit.theta.core.type.functype.FuncExprs.Func; -import static hu.bme.mit.theta.core.type.functype.FuncExprs.UnsafeApp; -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; -import static hu.bme.mit.theta.core.type.rattype.RatExprs.Rat; -import static java.lang.String.format; - import com.google.common.collect.ImmutableList; -import com.microsoft.z3.ArrayExpr; -import com.microsoft.z3.ArraySort; -import com.microsoft.z3.FPNum; -import com.microsoft.z3.FuncDecl; -import com.microsoft.z3.Model; -import com.microsoft.z3.Sort; -import com.microsoft.z3.Z3Exception; +import com.microsoft.z3.*; import com.microsoft.z3.enumerations.Z3_decl_kind; import com.microsoft.z3.enumerations.Z3_sort_kind; import hu.bme.mit.theta.common.TernaryOperator; @@ -52,25 +27,12 @@ import hu.bme.mit.theta.core.decl.ParamDecl; import hu.bme.mit.theta.core.type.Expr; import hu.bme.mit.theta.core.type.Type; -import hu.bme.mit.theta.core.type.abstracttype.AddExpr; -import hu.bme.mit.theta.core.type.abstracttype.EqExpr; -import hu.bme.mit.theta.core.type.abstracttype.GeqExpr; -import hu.bme.mit.theta.core.type.abstracttype.GtExpr; -import hu.bme.mit.theta.core.type.abstracttype.LeqExpr; -import hu.bme.mit.theta.core.type.abstracttype.LtExpr; -import hu.bme.mit.theta.core.type.abstracttype.MulExpr; +import hu.bme.mit.theta.core.type.abstracttype.*; import hu.bme.mit.theta.core.type.anytype.IteExpr; import hu.bme.mit.theta.core.type.arraytype.ArrayReadExpr; import hu.bme.mit.theta.core.type.arraytype.ArrayType; import hu.bme.mit.theta.core.type.arraytype.ArrayWriteExpr; -import hu.bme.mit.theta.core.type.booltype.AndExpr; -import hu.bme.mit.theta.core.type.booltype.BoolType; -import hu.bme.mit.theta.core.type.booltype.FalseExpr; -import hu.bme.mit.theta.core.type.booltype.IffExpr; -import hu.bme.mit.theta.core.type.booltype.ImplyExpr; -import hu.bme.mit.theta.core.type.booltype.NotExpr; -import hu.bme.mit.theta.core.type.booltype.OrExpr; -import hu.bme.mit.theta.core.type.booltype.TrueExpr; +import hu.bme.mit.theta.core.type.booltype.*; import hu.bme.mit.theta.core.type.enumtype.EnumLitExpr; import hu.bme.mit.theta.core.type.enumtype.EnumType; import hu.bme.mit.theta.core.type.fptype.FpRoundingMode; @@ -84,6 +46,9 @@ import hu.bme.mit.theta.core.utils.BvUtils; import hu.bme.mit.theta.core.utils.FpUtils; import hu.bme.mit.theta.core.utils.TypeUtils; +import kotlin.Pair; +import org.kframework.mpfr.BigFloat; + import java.math.BigInteger; import java.util.ArrayList; import java.util.Arrays; @@ -95,7 +60,20 @@ import java.util.function.UnaryOperator; import java.util.stream.Collectors; import java.util.stream.Stream; -import org.kframework.mpfr.BigFloat; + +import static com.google.common.base.Preconditions.*; +import static com.google.common.collect.ImmutableList.toImmutableList; +import static hu.bme.mit.theta.common.Utils.head; +import static hu.bme.mit.theta.common.Utils.tail; +import static hu.bme.mit.theta.core.decl.Decls.Param; +import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.Array; +import static hu.bme.mit.theta.core.type.booltype.BoolExprs.*; +import static hu.bme.mit.theta.core.type.bvtype.BvExprs.BvType; +import static hu.bme.mit.theta.core.type.functype.FuncExprs.Func; +import static hu.bme.mit.theta.core.type.functype.FuncExprs.UnsafeApp; +import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; +import static hu.bme.mit.theta.core.type.rattype.RatExprs.Rat; +import static java.lang.String.format; final class Z3TermTransformer { @@ -182,7 +160,7 @@ private Expr createIndexValueArrayLitExpr( .map( entry -> { checkState(entry.get1().size() == 1); - return Tuple2.of( + return new Pair<>( (Expr) entry.get1().get(0), (Expr) entry.get2()); }) .collect(Collectors.toUnmodifiableList()), diff --git a/subprojects/xcfa/c2xcfa/src/main/java/hu/bme/mit/theta/c2xcfa/FrontendXcfaBuilder.kt b/subprojects/xcfa/c2xcfa/src/main/java/hu/bme/mit/theta/c2xcfa/FrontendXcfaBuilder.kt index 3b85d371de..6c462d4ae9 100644 --- a/subprojects/xcfa/c2xcfa/src/main/java/hu/bme/mit/theta/c2xcfa/FrontendXcfaBuilder.kt +++ b/subprojects/xcfa/c2xcfa/src/main/java/hu/bme/mit/theta/c2xcfa/FrontendXcfaBuilder.kt @@ -17,7 +17,6 @@ package hu.bme.mit.theta.c2xcfa -import com.google.common.base.Preconditions import com.google.common.base.Preconditions.checkState import hu.bme.mit.theta.common.logging.Logger import hu.bme.mit.theta.core.decl.Decls @@ -29,21 +28,18 @@ import hu.bme.mit.theta.core.stmt.Stmts import hu.bme.mit.theta.core.stmt.Stmts.Assume import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.Type -import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs -import hu.bme.mit.theta.core.type.abstracttype.AddExpr -import hu.bme.mit.theta.core.type.abstracttype.DivExpr -import hu.bme.mit.theta.core.type.abstracttype.MulExpr -import hu.bme.mit.theta.core.type.abstracttype.SubExpr +import hu.bme.mit.theta.core.type.abstracttype.* import hu.bme.mit.theta.core.type.anytype.Dereference import hu.bme.mit.theta.core.type.anytype.Exprs.Dereference import hu.bme.mit.theta.core.type.anytype.RefExpr import hu.bme.mit.theta.core.type.arraytype.ArrayLitExpr import hu.bme.mit.theta.core.type.arraytype.ArrayType import hu.bme.mit.theta.core.type.booltype.BoolExprs -import hu.bme.mit.theta.core.type.booltype.BoolExprs.* +import hu.bme.mit.theta.core.type.booltype.BoolExprs.False +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Not +import hu.bme.mit.theta.core.type.booltype.BoolExprs.True import hu.bme.mit.theta.core.type.booltype.BoolType import hu.bme.mit.theta.core.type.bvtype.BvLitExpr -import hu.bme.mit.theta.core.type.inttype.IntExprs.Int import hu.bme.mit.theta.core.type.inttype.IntLitExpr import hu.bme.mit.theta.core.utils.BvUtils import hu.bme.mit.theta.core.utils.ExprUtils @@ -241,7 +237,7 @@ class FrontendXcfaBuilder( } for (function in cProgram.functions) { val toAdd: XcfaProcedureBuilder = handleFunction(function, initStmtList, builder) - if (toAdd.name.equals("main")) builder.addEntryPoint(toAdd, listOf()) + if (toAdd.name == "main") builder.addEntryPoint(toAdd, listOf()) } return builder } @@ -260,7 +256,7 @@ class FrontendXcfaBuilder( XcfaProcedureBuilder(funcDecl.name, CPasses(checkOverflow, parseContext, uniqueWarningLogger)) xcfaBuilder.addProcedure(builder) val initStmtList = ArrayList() - if (param.size > 0 && builder.name.equals("main")) { + if (param.isNotEmpty() && builder.name == "main") { initStmtList.addAll(param) } // builder.setRetType(if (funcDecl.actualType is CVoid) null else @@ -278,7 +274,7 @@ class FrontendXcfaBuilder( builder.addParam(toAdd, ParamDirection.OUT) } for (functionParam in funcDecl.functionParams) { - Preconditions.checkState( + checkState( functionParam.actualType is CVoid || functionParam.varDecls.size > 0, "Function param should have an associated variable!", ) @@ -431,7 +427,7 @@ class FrontendXcfaBuilder( val returnLoc = param.returnLoc val initLoc = getLoc(builder, statement.id, metadata = getMetadata(statement)) builder.addLoc(initLoc) - var xcfaEdge: XcfaEdge = XcfaEdge(lastLoc, initLoc, metadata = getMetadata(statement)) + var xcfaEdge = XcfaEdge(lastLoc, initLoc, metadata = getMetadata(statement)) builder.addEdge(xcfaEdge) val location = getAnonymousLoc(builder, metadata = getMetadata(statement)) builder.addLoc(location) @@ -458,7 +454,7 @@ class FrontendXcfaBuilder( val returnLoc = param.returnLoc val initLoc = getLoc(builder, statement.id, metadata = getMetadata(statement)) builder.addLoc(initLoc) - var edge: XcfaEdge = XcfaEdge(lastLoc, initLoc, metadata = getMetadata(statement)) + var edge = XcfaEdge(lastLoc, initLoc, metadata = getMetadata(statement)) builder.addEdge(edge) check(breakLoc != null) edge = XcfaEdge(initLoc, breakLoc, metadata = getMetadata(statement)) @@ -479,7 +475,7 @@ class FrontendXcfaBuilder( val myParams = statement.params var initLoc = getLoc(builder, statement.id, metadata = getMetadata(statement)) builder.addLoc(initLoc) - var xcfaEdge: XcfaEdge = XcfaEdge(lastLoc, initLoc, metadata = getMetadata(statement)) + var xcfaEdge = XcfaEdge(lastLoc, initLoc, metadata = getMetadata(statement)) builder.addEdge(xcfaEdge) val location = getAnonymousLoc(builder, metadata = getMetadata(statement)) builder.addLoc(location) @@ -546,11 +542,11 @@ class FrontendXcfaBuilder( val returnLoc = param.returnLoc val initLoc = getLoc(builder, statement.id, metadata = getMetadata(statement)) builder.addLoc(initLoc) - var edge: XcfaEdge = XcfaEdge(lastLoc, initLoc, metadata = getMetadata(statement)) + var edge = XcfaEdge(lastLoc, initLoc, metadata = getMetadata(statement)) builder.addEdge(edge) check(continueLoc != null) edge = XcfaEdge(initLoc, continueLoc, metadata = getMetadata(statement)) - val unreachableLoc: XcfaLocation = + val unreachableLoc = XcfaLocation("Unreachable" + XcfaLocation.uniqueCounter(), metadata = getMetadata(statement)) builder.addLoc(unreachableLoc) builder.addEdge(edge) @@ -587,7 +583,7 @@ class FrontendXcfaBuilder( builder.addLoc(outerInnerGuard) builder.addLoc(innerEndLoc) builder.addLoc(initLoc) - var xcfaEdge: XcfaEdge = XcfaEdge(lastLoc, initLoc, metadata = getMetadata(statement)) + var xcfaEdge = XcfaEdge(lastLoc, initLoc, metadata = getMetadata(statement)) builder.addEdge(xcfaEdge) val lastBody = body.accept(this, ParamPack(builder, initLoc, endLoc, innerEndLoc, returnLoc)) xcfaEdge = XcfaEdge(lastBody, innerEndLoc, metadata = getMetadata(statement)) @@ -596,7 +592,7 @@ class FrontendXcfaBuilder( buildWithoutPostStatement(guard, ParamPack(builder, innerEndLoc, null, null, returnLoc)) val assume = StmtLabel( - Stmts.Assume( + Assume( AbstractExprs.Neq( guard.expression, CComplexType.getType(guard.expression, parseContext).nullValue, @@ -609,7 +605,7 @@ class FrontendXcfaBuilder( builder.addEdge(xcfaEdge) val assume1 = StmtLabel( - Stmts.Assume( + Assume( AbstractExprs.Eq( guard.expression, CComplexType.getType(guard.expression, parseContext).nullValue, @@ -660,7 +656,7 @@ class FrontendXcfaBuilder( builder.addLoc(endInit) builder.addLoc(initLoc) builder.addLoc(startIncrement) - var xcfaEdge: XcfaEdge = XcfaEdge(lastLoc, initLoc, metadata = getMetadata(statement)) + var xcfaEdge = XcfaEdge(lastLoc, initLoc, metadata = getMetadata(statement)) builder.addEdge(xcfaEdge) val lastInit = if (init == null) initLoc @@ -670,7 +666,7 @@ class FrontendXcfaBuilder( else buildWithoutPostStatement(guard, ParamPack(builder, lastInit!!, null, null, returnLoc)) val assume = StmtLabel( - Stmts.Assume( + Assume( if (guard == null) True() else AbstractExprs.Neq( @@ -686,7 +682,7 @@ class FrontendXcfaBuilder( builder.addEdge(xcfaEdge) val assume1 = StmtLabel( - Stmts.Assume( + Assume( if (guard == null) False() else AbstractExprs.Eq( @@ -736,7 +732,7 @@ class FrontendXcfaBuilder( val returnLoc = param.returnLoc val initLoc = getLoc(builder, statement.id, metadata = getMetadata(statement)) builder.addLoc(initLoc) - var edge: XcfaEdge = XcfaEdge(lastLoc, initLoc, metadata = getMetadata(statement)) + var edge = XcfaEdge(lastLoc, initLoc, metadata = getMetadata(statement)) builder.addEdge(edge) edge = XcfaEdge( @@ -745,7 +741,7 @@ class FrontendXcfaBuilder( metadata = getMetadata(statement), ) builder.addLoc(getLoc(builder, statement.label, metadata = getMetadata(statement))) - val unreachableLoc: XcfaLocation = + val unreachableLoc = XcfaLocation("Unreachable" + XcfaLocation.uniqueCounter(), metadata = getMetadata(statement)) builder.addLoc(unreachableLoc) builder.addEdge(edge) @@ -769,7 +765,7 @@ class FrontendXcfaBuilder( builder.addLoc(mainBranch) builder.addLoc(elseBranch) builder.addLoc(initLoc) - var xcfaEdge: XcfaEdge = XcfaEdge(lastLoc, initLoc, metadata = getMetadata(statement)) + var xcfaEdge = XcfaEdge(lastLoc, initLoc, metadata = getMetadata(statement)) builder.addEdge(xcfaEdge) val endGuard = buildWithoutPostStatement( @@ -778,7 +774,7 @@ class FrontendXcfaBuilder( ) val assume = StmtLabel( - Stmts.Assume( + Assume( AbstractExprs.Neq( guard.expression, CComplexType.getType(guard.expression, parseContext).nullValue, @@ -791,7 +787,7 @@ class FrontendXcfaBuilder( builder.addEdge(xcfaEdge) val assume1 = StmtLabel( - Stmts.Assume( + Assume( AbstractExprs.Eq( guard.expression, CComplexType.getType(guard.expression, parseContext).nullValue, @@ -851,7 +847,7 @@ class FrontendXcfaBuilder( val expr = statement.expr val initLoc = getLoc(builder, statement.id, metadata = getMetadata(statement)) builder.addLoc(initLoc) - val xcfaEdge: XcfaEdge = XcfaEdge(lastLoc, initLoc, metadata = getMetadata(statement)) + val xcfaEdge = XcfaEdge(lastLoc, initLoc, metadata = getMetadata(statement)) builder.addEdge(xcfaEdge) val endExpr = expr?.accept(this, ParamPack(builder, initLoc, breakLoc, continueLoc, returnLoc)) ?: initLoc @@ -889,15 +885,15 @@ class FrontendXcfaBuilder( builder.addLoc(initLoc) val endLoc = getAnonymousLoc(builder, metadata = getMetadata(statement)) builder.addLoc(endLoc) - val edge: XcfaEdge = XcfaEdge(lastLoc, initLoc, metadata = getMetadata(statement)) + val edge = XcfaEdge(lastLoc, initLoc, metadata = getMetadata(statement)) builder.addEdge(edge) val endInit = buildWithoutPostStatement( testValue, ParamPack(builder, initLoc, breakLoc, continueLoc, returnLoc), ) - Preconditions.checkState(body is CCompound, "Switch body has to be a CompoundStatement!") - var defaultExpr: Expr? = True() + checkState(body is CCompound, "Switch body has to be a CompoundStatement!") + var defaultExpr: Expr = True() for (cStatement in (body as CCompound).getcStatementList()) { if (cStatement is CCase) { defaultExpr = @@ -924,7 +920,7 @@ class FrontendXcfaBuilder( ) val assume = StmtLabel( - Stmts.Assume(AbstractExprs.Eq(testValue.expression, cStatement.expr.expression)), + Assume(AbstractExprs.Eq(testValue.expression, cStatement.expr.expression)), choiceType = ChoiceType.MAIN_PATH, metadata = getMetadata(testValue), ) @@ -938,7 +934,7 @@ class FrontendXcfaBuilder( ) val assume = StmtLabel( - Stmts.Assume(defaultExpr), + Assume(defaultExpr), choiceType = ChoiceType.MAIN_PATH, // TODO: is this what validators expect? metadata = getMetadata(cStatement), ) @@ -949,7 +945,7 @@ class FrontendXcfaBuilder( cStatement.accept(this, ParamPack(builder, location, endLoc, continueLoc, returnLoc)) } if (lastLocation != null) { - val xcfaEdge: XcfaEdge = XcfaEdge(lastLocation, endLoc, metadata = getMetadata(statement)) + val xcfaEdge = XcfaEdge(lastLocation, endLoc, metadata = getMetadata(statement)) builder.addEdge(xcfaEdge) } return endLoc @@ -966,7 +962,7 @@ class FrontendXcfaBuilder( val body = statement.body var initLoc = getLoc(builder, statement.id, metadata = getMetadata(statement)) builder.addLoc(initLoc) - var xcfaEdge: XcfaEdge = XcfaEdge(lastLoc, initLoc, metadata = getMetadata(statement)) + var xcfaEdge = XcfaEdge(lastLoc, initLoc, metadata = getMetadata(statement)) builder.addEdge(xcfaEdge) val endLoc = getAnonymousLoc(builder, metadata = getMetadata(statement)) builder.addLoc(endLoc) @@ -983,7 +979,7 @@ class FrontendXcfaBuilder( } val assume = StmtLabel( - Stmts.Assume( + Assume( AbstractExprs.Neq( guard.expression, CComplexType.getType(guard.expression, parseContext).nullValue, @@ -996,7 +992,7 @@ class FrontendXcfaBuilder( builder.addEdge(xcfaEdge) val assume1 = StmtLabel( - Stmts.Assume( + Assume( AbstractExprs.Eq( guard.expression, CComplexType.getType(guard.expression, parseContext).nullValue, @@ -1021,7 +1017,7 @@ class FrontendXcfaBuilder( } private fun buildWithoutPostStatement(cStatement: CStatement, param: ParamPack): XcfaLocation { - Preconditions.checkState( + checkState( cStatement is CCompound, "Currently only CCompounds have pre- and post statements!", ) @@ -1062,7 +1058,7 @@ class FrontendXcfaBuilder( } private fun buildPostStatement(cStatement: CStatement, param: ParamPack): XcfaLocation { - Preconditions.checkState( + checkState( cStatement is CCompound, "Currently only CCompounds have pre- and post statements!", ) diff --git a/subprojects/xcfa/llvm2xcfa/src/main/java/hu/bme/mit/theta/llvm2xcfa/Utils.java b/subprojects/xcfa/llvm2xcfa/src/main/java/hu/bme/mit/theta/llvm2xcfa/Utils.java index 22c61a3691..f546f53fe4 100644 --- a/subprojects/xcfa/llvm2xcfa/src/main/java/hu/bme/mit/theta/llvm2xcfa/Utils.java +++ b/subprojects/xcfa/llvm2xcfa/src/main/java/hu/bme/mit/theta/llvm2xcfa/Utils.java @@ -15,14 +15,6 @@ */ package hu.bme.mit.theta.llvm2xcfa; -import static hu.bme.mit.theta.core.decl.Decls.Var; -import static hu.bme.mit.theta.core.stmt.Stmts.Assign; -import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.Array; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; -import static hu.bme.mit.theta.core.type.rattype.RatExprs.Rat; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; - import hu.bme.mit.theta.common.Tuple2; import hu.bme.mit.theta.core.decl.VarDecl; import hu.bme.mit.theta.core.stmt.Stmt; @@ -43,16 +35,22 @@ import hu.bme.mit.theta.llvm2xcfa.handlers.arguments.RegArgument; import hu.bme.mit.theta.llvm2xcfa.handlers.states.BlockState; import hu.bme.mit.theta.llvm2xcfa.handlers.states.FunctionState; -import hu.bme.mit.theta.xcfa.model.EmptyMetaData; -import hu.bme.mit.theta.xcfa.model.NopLabel; -import hu.bme.mit.theta.xcfa.model.StmtLabel; -import hu.bme.mit.theta.xcfa.model.XcfaEdge; -import hu.bme.mit.theta.xcfa.model.XcfaLocation; +import hu.bme.mit.theta.xcfa.model.*; +import kotlin.Pair; + import java.math.BigInteger; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; +import static hu.bme.mit.theta.core.decl.Decls.Var; +import static hu.bme.mit.theta.core.stmt.Stmts.Assign; +import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.Array; +import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; +import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; +import static hu.bme.mit.theta.core.type.rattype.RatExprs.Rat; +import static hu.bme.mit.theta.core.utils.TypeUtils.cast; + public class Utils { private static final int doublePrecision = 1 << 8; public static ArithmeticType arithmeticType; @@ -158,7 +156,7 @@ else if (type instanceof BvType) else if (type instanceof ArrayType) return ArrayLitExpr.of( List.of( - Tuple2.of( + new Pair<>( IntLitExpr.of(BigInteger.ZERO), cast( getDefaultValue(((ArrayType) type).getElemType()), diff --git a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaToMonolithicExpr.kt b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaToMonolithicExpr.kt index 75ff510cab..faea5bfe6f 100644 --- a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaToMonolithicExpr.kt +++ b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaToMonolithicExpr.kt @@ -30,7 +30,9 @@ import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.LitExpr import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Eq import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Neq -import hu.bme.mit.theta.core.type.booltype.BoolExprs.* +import hu.bme.mit.theta.core.type.booltype.BoolExprs.And +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool +import hu.bme.mit.theta.core.type.booltype.BoolExprs.True import hu.bme.mit.theta.core.type.booltype.BoolType import hu.bme.mit.theta.core.type.bvtype.BvLitExpr import hu.bme.mit.theta.core.type.bvtype.BvType @@ -47,10 +49,12 @@ import hu.bme.mit.theta.core.utils.indexings.VarIndexingFactory import hu.bme.mit.theta.frontend.ParseContext import hu.bme.mit.theta.frontend.transformation.model.types.complex.integer.cint.CInt import hu.bme.mit.theta.xcfa.getFlatLabels -import hu.bme.mit.theta.xcfa.model.* -import java.math.BigInteger -import java.util.* +import hu.bme.mit.theta.xcfa.model.StmtLabel +import hu.bme.mit.theta.xcfa.model.XCFA +import hu.bme.mit.theta.xcfa.model.XcfaEdge +import hu.bme.mit.theta.xcfa.model.XcfaLocation import org.kframework.mpfr.BigFloat +import java.math.BigInteger private val LitExpr<*>.value: Int get() = diff --git a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/oc/XcfaOcChecker.kt b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/oc/XcfaOcChecker.kt index df885ac2f1..6b81c6d007 100644 --- a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/oc/XcfaOcChecker.kt +++ b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/oc/XcfaOcChecker.kt @@ -37,10 +37,14 @@ import hu.bme.mit.theta.core.stmt.HavocStmt import hu.bme.mit.theta.core.stmt.MemoryAssignStmt import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.Type -import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Eq import hu.bme.mit.theta.core.type.anytype.Dereference import hu.bme.mit.theta.core.type.anytype.RefExpr -import hu.bme.mit.theta.core.type.booltype.BoolExprs.* +import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Eq +import hu.bme.mit.theta.core.type.booltype.BoolExprs.And +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Imply +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Not +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Or +import hu.bme.mit.theta.core.type.booltype.BoolExprs.True import hu.bme.mit.theta.core.type.booltype.BoolType import hu.bme.mit.theta.core.type.inttype.IntExprs.Int import hu.bme.mit.theta.core.utils.ExprUtils @@ -52,7 +56,7 @@ import hu.bme.mit.theta.xcfa.* import hu.bme.mit.theta.xcfa.analysis.XcfaPrec import hu.bme.mit.theta.xcfa.analysis.oc.XcfaOcMemoryConsistencyModel.SC import hu.bme.mit.theta.xcfa.model.* -import hu.bme.mit.theta.xcfa.passes.* +import hu.bme.mit.theta.xcfa.passes.OcExtraPasses import kotlin.time.measureTime private val Expr<*>.vars @@ -471,7 +475,7 @@ class XcfaOcChecker( .filter { it.assignment != null } .forEach { event -> if (event.guard.isEmpty()) solver.add(event.assignment) - else solver.add(Imply(event.guardExpr, event.assignment)) + else solver.add(Imply(event.guardExpr, event.assignment!!)) } // Branching conditions @@ -490,7 +494,7 @@ class XcfaOcChecker( And(rel.from.guardExpr, rel.to.guardExpr, Eq(rel.from.const.ref, rel.to.const.ref)) if (v == memoryDecl) { conseq = - And(conseq, Eq(rel.from.array, rel.to.array), Eq(rel.from.offset, rel.to.offset)) + And(conseq, Eq(rel.from.array!!, rel.to.array!!), Eq(rel.from.offset!!, rel.to.offset!!)) } solver.add(Imply(rel.declRef, conseq)) // RF-Val } diff --git a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/oc/XcfaOcTypes.kt b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/oc/XcfaOcTypes.kt index 335ab942dc..a39ffd8c90 100644 --- a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/oc/XcfaOcTypes.kt +++ b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/oc/XcfaOcTypes.kt @@ -163,7 +163,7 @@ internal class XcfaEvent( arrayEq = null } - var offsetEq: Expr? = Eq(offset, other.offset) + var offsetEq: Expr? = Eq(offset!!, other.offset!!) if (offsetStatic != null && other.offsetStatic != null) { if (offsetStatic != other.offsetStatic) return null offsetEq = null diff --git a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/por/XcfaSporLts.kt b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/por/XcfaSporLts.kt index 49bf538422..010dc6af8e 100644 --- a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/por/XcfaSporLts.kt +++ b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/por/XcfaSporLts.kt @@ -24,7 +24,9 @@ import hu.bme.mit.theta.core.decl.VarDecl import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.LitExpr import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Eq -import hu.bme.mit.theta.core.type.booltype.BoolExprs.* +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Or +import hu.bme.mit.theta.core.type.booltype.BoolExprs.True import hu.bme.mit.theta.core.type.booltype.BoolType import hu.bme.mit.theta.core.utils.ExprUtils import hu.bme.mit.theta.core.utils.PathUtils diff --git a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/Utils.kt b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/Utils.kt index 2008a20f79..ac5efeb5b0 100644 --- a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/Utils.kt +++ b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/Utils.kt @@ -552,9 +552,9 @@ fun XcfaLabel.simplify(valuation: MutableValuation, parseContext: ParseContext): data class MallocLitExpr(val kType: T) : NullaryExpr(), LitExpr { - override fun getType(): T = kType + override val type: T = kType - override fun eval(valuation: Valuation): LitExpr = this + override fun eval(`val`: Valuation): LitExpr = this } val XCFA.lazyPointsToGraph: Lazy, Set>>> diff --git a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/XcfaToC.kt b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/XcfaToC.kt index 2582fb4a20..fe36edadae 100644 --- a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/XcfaToC.kt +++ b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/XcfaToC.kt @@ -333,7 +333,7 @@ fun ArrayReadExpr<*, *>.toC(parseContext: ParseContext): String = "array_read(${this.array.toC(parseContext)}, ${this.index.toC(parseContext)})" fun IteExpr<*>.toC(parseContext: ParseContext): String = - "(${this.cond.toC(parseContext)} ? ${this.then.toC(parseContext)} : ${this.`else`.toC(parseContext)})" + "(${this.cond.toC(parseContext)} ? ${this.then.toC(parseContext)} : ${this.elze.toC(parseContext)})" // nullary: ref + lit fun NullaryExpr<*>.toC(parseContext: ParseContext): String = diff --git a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/model/Dsl.kt b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/model/Dsl.kt index c05e3ee07d..03d90d8a22 100644 --- a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/model/Dsl.kt +++ b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/model/Dsl.kt @@ -20,7 +20,9 @@ import hu.bme.mit.theta.common.dsl.Symbol import hu.bme.mit.theta.common.dsl.SymbolTable import hu.bme.mit.theta.core.decl.Decls.Var import hu.bme.mit.theta.core.decl.VarDecl -import hu.bme.mit.theta.core.stmt.Stmts.* +import hu.bme.mit.theta.core.stmt.Stmts.Assign +import hu.bme.mit.theta.core.stmt.Stmts.Assume +import hu.bme.mit.theta.core.stmt.Stmts.Havoc import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.LitExpr import hu.bme.mit.theta.core.type.Type diff --git a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/model/XcfaLabel.kt b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/model/XcfaLabel.kt index 8f6d29cb47..b0714c16ec 100644 --- a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/model/XcfaLabel.kt +++ b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/model/XcfaLabel.kt @@ -21,7 +21,7 @@ import hu.bme.mit.theta.core.decl.VarDecl import hu.bme.mit.theta.core.stmt.NonDetStmt import hu.bme.mit.theta.core.stmt.SequenceStmt import hu.bme.mit.theta.core.stmt.Stmt -import hu.bme.mit.theta.core.stmt.Stmts.* +import hu.bme.mit.theta.core.stmt.Stmts.Skip import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.grammar.dsl.expr.ExpressionWrapper import hu.bme.mit.theta.grammar.dsl.stmt.StatementWrapper diff --git a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/FpFunctionsToExprsPass.kt b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/FpFunctionsToExprsPass.kt index 605224cefa..63d3dead95 100644 --- a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/FpFunctionsToExprsPass.kt +++ b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/FpFunctionsToExprsPass.kt @@ -161,7 +161,7 @@ class FpFunctionsToExprsPass(val parseContext: ParseContext) : ProcedurePass { TypeUtils.cast( CComplexType.getType(expr, parseContext).castTo(callStmt.params[1]), CComplexType.getType(expr, parseContext).smtType, - ) as Expr, + ) as Expr, ), ) if (parseContext.metadata.getMetadataValue(expr, "cType").isPresent) { @@ -182,7 +182,7 @@ class FpFunctionsToExprsPass(val parseContext: ParseContext) : ProcedurePass { TypeUtils.cast( CComplexType.getType(expr, parseContext).castTo(callStmt.params[1]), CComplexType.getType(expr, parseContext).smtType, - ) as Expr, + ) as Expr, ), ) if (parseContext.metadata.getMetadataValue(expr, "cType").isPresent) { @@ -201,7 +201,7 @@ class FpFunctionsToExprsPass(val parseContext: ParseContext) : ProcedurePass { TypeUtils.cast((expr as RefExpr<*>).decl as VarDecl<*>, type.smtType), TypeUtils.cast( AbstractExprs.Ite( - FpIsInfiniteExpr.of(callStmt.params[1] as Expr), + FpIsInfiniteExpr.of(callStmt.params[1] as Expr), type.unitValue, type.nullValue, ), @@ -223,8 +223,8 @@ class FpFunctionsToExprsPass(val parseContext: ParseContext) : ProcedurePass { TypeUtils.cast( AbstractExprs.Ite( Or( - FpIsInfiniteExpr.of(callStmt.params[1] as Expr), - FpIsNanExpr.of(callStmt.params[1] as Expr), + FpIsInfiniteExpr.of(callStmt.params[1] as Expr), + FpIsNanExpr.of(callStmt.params[1] as Expr), ), type.nullValue, type.unitValue, @@ -255,7 +255,7 @@ class FpFunctionsToExprsPass(val parseContext: ParseContext) : ProcedurePass { TypeUtils.cast((expr as RefExpr<*>).decl as VarDecl<*>, type.smtType), TypeUtils.cast( AbstractExprs.Ite( - FpIsNanExpr.of(callStmt.params[1] as Expr), + FpIsNanExpr.of(callStmt.params[1] as Expr), type.unitValue, type.nullValue, ), @@ -281,7 +281,7 @@ class FpFunctionsToExprsPass(val parseContext: ParseContext) : ProcedurePass { TypeUtils.cast( CComplexType.getType(expr, parseContext).castTo(callStmt.params[1]), CComplexType.getType(expr, parseContext).smtType, - ) as Expr, + ) as Expr, ), ) if (parseContext.metadata.getMetadataValue(expr, "cType").isPresent) { @@ -302,7 +302,7 @@ class FpFunctionsToExprsPass(val parseContext: ParseContext) : ProcedurePass { TypeUtils.cast( CComplexType.getType(expr, parseContext).castTo(callStmt.params[1]), CComplexType.getType(expr, parseContext).smtType, - ) as Expr, + ) as Expr, ), ) if (parseContext.metadata.getMetadataValue(expr, "cType").isPresent) { @@ -326,11 +326,11 @@ class FpFunctionsToExprsPass(val parseContext: ParseContext) : ProcedurePass { TypeUtils.cast( CComplexType.getType(expr, parseContext).castTo(callStmt.params[1]), CComplexType.getType(expr, parseContext).smtType, - ) as Expr, + ) as Expr, TypeUtils.cast( CComplexType.getType(expr, parseContext).castTo(callStmt.params[2]), CComplexType.getType(expr, parseContext).smtType, - ) as Expr, + ) as Expr, ), ) if (parseContext.metadata.getMetadataValue(expr, "cType").isPresent) { @@ -350,11 +350,11 @@ class FpFunctionsToExprsPass(val parseContext: ParseContext) : ProcedurePass { TypeUtils.cast( CComplexType.getType(expr, parseContext).castTo(callStmt.params[1]), CComplexType.getType(expr, parseContext).smtType, - ) as Expr, + ) as Expr, TypeUtils.cast( CComplexType.getType(expr, parseContext).castTo(callStmt.params[2]), CComplexType.getType(expr, parseContext).smtType, - ) as Expr, + ) as Expr, ), ) if (parseContext.metadata.getMetadataValue(expr, "cType").isPresent) { @@ -375,7 +375,7 @@ class FpFunctionsToExprsPass(val parseContext: ParseContext) : ProcedurePass { TypeUtils.cast( CComplexType.getType(expr, parseContext).castTo(callStmt.params[1]), CComplexType.getType(expr, parseContext).smtType, - ) as Expr, + ) as Expr, ), ) if (parseContext.metadata.getMetadataValue(expr, "cType").isPresent) { @@ -395,7 +395,7 @@ class FpFunctionsToExprsPass(val parseContext: ParseContext) : ProcedurePass { TypeUtils.cast( CComplexType.getType(expr, parseContext).castTo(callStmt.params[1]), CComplexType.getType(expr, parseContext).smtType, - ) as Expr + ) as Expr ), ) if (parseContext.metadata.getMetadataValue(expr, "cType").isPresent) { diff --git a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/MemsafetyPass.kt b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/MemsafetyPass.kt index 5d5fbdc361..e2e4e54202 100644 --- a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/MemsafetyPass.kt +++ b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/MemsafetyPass.kt @@ -18,7 +18,10 @@ package hu.bme.mit.theta.xcfa.passes import hu.bme.mit.theta.core.decl.Decls.Var import hu.bme.mit.theta.core.stmt.Stmts.Assume import hu.bme.mit.theta.core.type.Type -import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.* +import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Gt +import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Leq +import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Lt +import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Mul import hu.bme.mit.theta.core.type.arraytype.ArrayReadExpr import hu.bme.mit.theta.core.type.booltype.BoolExprs.Or import hu.bme.mit.theta.frontend.ParseContext diff --git a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/MutexToVarPass.kt b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/MutexToVarPass.kt index 7c9970555f..d1278cd811 100644 --- a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/MutexToVarPass.kt +++ b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/MutexToVarPass.kt @@ -19,10 +19,15 @@ import hu.bme.mit.theta.core.decl.Decls import hu.bme.mit.theta.core.decl.VarDecl import hu.bme.mit.theta.core.stmt.AssignStmt import hu.bme.mit.theta.core.stmt.AssumeStmt -import hu.bme.mit.theta.core.type.booltype.BoolExprs.* +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool +import hu.bme.mit.theta.core.type.booltype.BoolExprs.False +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Not +import hu.bme.mit.theta.core.type.booltype.BoolExprs.True import hu.bme.mit.theta.core.type.booltype.BoolType -import hu.bme.mit.theta.xcfa.* +import hu.bme.mit.theta.xcfa.acquiredMutex +import hu.bme.mit.theta.xcfa.getFlatLabels import hu.bme.mit.theta.xcfa.model.* +import hu.bme.mit.theta.xcfa.releasedMutex /** * Replaces mutexes (except the atomic block mutexes) with boolean variables. mutex_lock(mutex_var) diff --git a/subprojects/xsts/xsts-analysis/src/main/kotlin/hu/bme/mit/theta/xsts/analysis/util/RandomXsts.kt b/subprojects/xsts/xsts-analysis/src/main/kotlin/hu/bme/mit/theta/xsts/analysis/util/RandomXsts.kt index 49bb325fe1..1eaeaceb88 100644 --- a/subprojects/xsts/xsts-analysis/src/main/kotlin/hu/bme/mit/theta/xsts/analysis/util/RandomXsts.kt +++ b/subprojects/xsts/xsts-analysis/src/main/kotlin/hu/bme/mit/theta/xsts/analysis/util/RandomXsts.kt @@ -38,22 +38,22 @@ fun generateXsts( ): XSTS { val writtenVars = object : StmtVisitor>, Set>> { - override fun visit(stmt: SkipStmt?, param: Set>): Set> { + override fun visit(stmt: SkipStmt, param: Set>): Set> { return param } - override fun visit(stmt: AssumeStmt?, param: Set>): Set> { + override fun visit(stmt: AssumeStmt, param: Set>): Set> { return param } - override fun visit( + override fun visit( stmt: AssignStmt, param: Set>, ): Set> { return setOf(stmt.varDecl) + param } - override fun visit( + override fun visit( stmt: HavocStmt, param: Set>, ): Set> { @@ -76,7 +76,7 @@ fun generateXsts( return res } - override fun visit(stmt: OrtStmt?, param: Set>?): Set> { + override fun visit(stmt: OrtStmt, param: Set>): Set> { TODO("Not yet implemented") } @@ -88,9 +88,9 @@ fun generateXsts( return stmt.then.accept(this, stmt.elze.accept(this, param)) } - override fun visit( - stmt: MemoryAssignStmt?, - param: Set>?, + override fun visit( + stmt: MemoryAssignStmt, + param: Set>, ): Set> { TODO("Not yet implemented") } @@ -129,8 +129,8 @@ class RandomXsts(seed: Int, val exprMaxDepth: Int) { var xsts: XSTS do { val trans = generateRandomStmt(depth, numCtrl, numClock, numOther) - val env = Stmts.NonDetStmt(listOf(Stmts.Skip())) - val init = Stmts.NonDetStmt(listOf(Stmts.Skip())) + val env = Stmts.NonDet(listOf(Stmts.Skip())) + val init = Stmts.NonDet(listOf(Stmts.Skip())) val initExpr = BoolExprs.And( ctrlVars.map { IntExprs.Eq(it.ref, IntExprs.Int(0)) } + @@ -193,7 +193,7 @@ class RandomXsts(seed: Int, val exprMaxDepth: Int) { } fun randomSeq(currDepth: Int, maxDepth: Int): Stmt { - return Stmts.SequenceStmt( + return Stmts.Sequence( listOf( randomIntermediate(currDepth + 1, maxDepth), randomIntermediate(currDepth + 1, maxDepth), @@ -202,7 +202,7 @@ class RandomXsts(seed: Int, val exprMaxDepth: Int) { } fun randomNonDet(currDepth: Int, maxDepth: Int): Stmt { - return Stmts.NonDetStmt( + return Stmts.NonDet( listOf( randomIntermediate(currDepth + 1, maxDepth), randomIntermediate(currDepth + 1, maxDepth), diff --git a/subprojects/xsts/xsts-analysis/src/main/kotlin/hu/bme/mit/theta/xsts/analysis/util/XstsSerializer.kt b/subprojects/xsts/xsts-analysis/src/main/kotlin/hu/bme/mit/theta/xsts/analysis/util/XstsSerializer.kt index 5841e305be..3c0cafb547 100644 --- a/subprojects/xsts/xsts-analysis/src/main/kotlin/hu/bme/mit/theta/xsts/analysis/util/XstsSerializer.kt +++ b/subprojects/xsts/xsts-analysis/src/main/kotlin/hu/bme/mit/theta/xsts/analysis/util/XstsSerializer.kt @@ -67,7 +67,7 @@ object XstsSerializer : StmtVisitor { return ExprWriter.instance().write(expr) } - override fun visit(stmt: SkipStmt?, param: Void?): String { + override fun visit(stmt: SkipStmt, param: Void?): String { return "" } @@ -75,11 +75,11 @@ object XstsSerializer : StmtVisitor { return "assume (${serializeExpr(stmt.cond)});" } - override fun visit(stmt: AssignStmt, param: Void?): String { + override fun visit(stmt: AssignStmt, param: Void?): String { return "${stmt.varDecl.name} := (${serializeExpr(stmt.expr)});" } - override fun visit(stmt: HavocStmt, param: Void?): String { + override fun visit(stmt: HavocStmt, param: Void?): String { return "havoc ${stmt.varDecl.name};" } @@ -91,7 +91,7 @@ object XstsSerializer : StmtVisitor { return "choice ${stmt.stmts.joinToString(" or ") { "{\n${it.accept(this, null)}\n}" }}" } - override fun visit(stmt: OrtStmt?, param: Void?): String { + override fun visit(stmt: OrtStmt, param: Void?): String { TODO("Not yet implemented") } @@ -119,8 +119,8 @@ object XstsSerializer : StmtVisitor { .trimIndent() } - override fun visit( - stmt: MemoryAssignStmt?, + override fun visit( + stmt: MemoryAssignStmt, param: Void?, ): String { TODO("Not yet implemented") diff --git a/subprojects/xsts/xsts/src/main/java/hu/bme/mit/theta/xsts/dsl/XstsExpression.java b/subprojects/xsts/xsts/src/main/java/hu/bme/mit/theta/xsts/dsl/XstsExpression.java index a804006127..dcb7151344 100644 --- a/subprojects/xsts/xsts/src/main/java/hu/bme/mit/theta/xsts/dsl/XstsExpression.java +++ b/subprojects/xsts/xsts/src/main/java/hu/bme/mit/theta/xsts/dsl/XstsExpression.java @@ -15,23 +15,7 @@ */ package hu.bme.mit.theta.xsts.dsl; -import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.base.Preconditions.checkNotNull; -import static hu.bme.mit.theta.common.Utils.head; -import static hu.bme.mit.theta.common.Utils.tail; -import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.*; -import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Eq; -import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Neq; -import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.*; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.*; -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; -import static hu.bme.mit.theta.core.utils.ExprUtils.simplify; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; -import static hu.bme.mit.theta.xsts.dsl.gen.XstsDslParser.*; -import static java.util.stream.Collectors.toList; - import com.google.common.collect.ImmutableList; -import hu.bme.mit.theta.common.Tuple2; import hu.bme.mit.theta.common.dsl.DynamicScope; import hu.bme.mit.theta.common.dsl.Env; import hu.bme.mit.theta.common.dsl.Symbol; @@ -49,6 +33,9 @@ import hu.bme.mit.theta.core.type.enumtype.EnumType; import hu.bme.mit.theta.core.type.inttype.IntLitExpr; import hu.bme.mit.theta.xsts.dsl.gen.XstsDslBaseVisitor; +import kotlin.Pair; +import org.antlr.v4.runtime.Token; + import java.math.BigInteger; import java.util.Collection; import java.util.List; @@ -56,7 +43,21 @@ import java.util.stream.Collectors; import java.util.stream.IntStream; import java.util.stream.Stream; -import org.antlr.v4.runtime.Token; + +import static com.google.common.base.Preconditions.checkArgument; +import static com.google.common.base.Preconditions.checkNotNull; +import static hu.bme.mit.theta.common.Utils.head; +import static hu.bme.mit.theta.common.Utils.tail; +import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.*; +import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Eq; +import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Neq; +import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.*; +import static hu.bme.mit.theta.core.type.booltype.BoolExprs.*; +import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; +import static hu.bme.mit.theta.core.utils.ExprUtils.simplify; +import static hu.bme.mit.theta.core.utils.TypeUtils.cast; +import static hu.bme.mit.theta.xsts.dsl.gen.XstsDslParser.*; +import static java.util.stream.Collectors.toList; final class XstsExpression { @@ -497,11 +498,11 @@ private Expr createArrayLitExpr( } valueType = (T2) ctx.elseExpr.accept(this).getType(); - final List, Expr>> elems = + final List, Expr>> elems = IntStream.range(0, ctx.indexExpr.size()) .mapToObj( i -> - Tuple2.of( + new Pair<>( cast( ctx.indexExpr.get(i).accept(this), indexType), From 2432872787fad693b7b28bbb0f29b9a02be4d335 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Csan=C3=A1d=20Telbisz?= Date: Tue, 24 Jun 2025 17:33:51 +0200 Subject: [PATCH 25/48] convert to serializable - fixes at call sites --- .../analysis/algorithm/bounded/BoundedChecker.kt | 10 ++++------ .../java/hu/bme/mit/theta/core/type/bvtype/BvType.kt | 5 +++-- .../impl/generic/GenericSmtLibExprTransformer.java | 12 ++++++------ .../src/main/java/hu/bme/mit/theta/c2xcfa/Utils.kt | 2 +- .../cli/checkers/ConfigToLassoValidationChecker.kt | 8 ++++++-- .../main/java/hu/bme/mit/theta/xcfa2chc/Xcfa2Chc.kt | 6 ++++-- 6 files changed, 24 insertions(+), 19 deletions(-) diff --git a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/bounded/BoundedChecker.kt b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/bounded/BoundedChecker.kt index 0ac2470751..fa0aba2d8d 100644 --- a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/bounded/BoundedChecker.kt +++ b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/bounded/BoundedChecker.kt @@ -27,13 +27,12 @@ import hu.bme.mit.theta.core.decl.Decls.Var import hu.bme.mit.theta.core.model.Valuation import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Eq -import hu.bme.mit.theta.core.type.booltype.BoolExprs.And -import hu.bme.mit.theta.core.type.booltype.BoolExprs.Not -import hu.bme.mit.theta.core.type.booltype.BoolExprs.Or import hu.bme.mit.theta.core.type.booltype.BoolExprs.True import hu.bme.mit.theta.core.type.booltype.BoolType import hu.bme.mit.theta.core.type.booltype.SmartBoolExprs -import hu.bme.mit.theta.core.type.booltype.SmartBoolExprs.* +import hu.bme.mit.theta.core.type.booltype.SmartBoolExprs.And +import hu.bme.mit.theta.core.type.booltype.SmartBoolExprs.Not +import hu.bme.mit.theta.core.type.booltype.SmartBoolExprs.Or import hu.bme.mit.theta.core.utils.ExprUtils import hu.bme.mit.theta.core.utils.PathUtils import hu.bme.mit.theta.core.utils.indexings.VarIndexing @@ -42,7 +41,6 @@ import hu.bme.mit.theta.solver.ItpSolver import hu.bme.mit.theta.solver.Solver import hu.bme.mit.theta.solver.utils.WithPushPop import java.util.* -import kotlin.collections.plus /** * A checker for bounded model checking. @@ -282,7 +280,7 @@ constructor( if (needProof) { // we enumerate all states explored by previous iteration of BMC val expr = - SmartBoolExprs.And( + And( exprs.subList(0, exprs.size - 1) + // loopfree.subList(0, loopfree.size - 1) + unfoldedInitExpr diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvType.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvType.kt index 957fe7f5db..9370b29139 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvType.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvType.kt @@ -22,12 +22,13 @@ import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.Type import hu.bme.mit.theta.core.type.abstracttype.* import hu.bme.mit.theta.core.type.fptype.FpExprs.FromBv -import hu.bme.mit.theta.core.type.fptype.FpRoundingMode +import hu.bme.mit.theta.core.type.fptype.FpRoundingMode.Companion.defaultRoundingMode import hu.bme.mit.theta.core.type.fptype.FpType import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import java.math.BigInteger + @Serializable @SerialName(BvType.TYPE_LABEL) data class BvType( @@ -63,7 +64,7 @@ data class BvType( override fun Cast(op: Expr, type: TargetType): Expr { if (type is FpType && signed != null) { @Suppress("UNCHECKED_CAST") - return FromBv(FpRoundingMode.RTZ, op, type, signed) as Expr + return FromBv(defaultRoundingMode, op, type as FpType, signed) as Expr } throw ClassCastException("Bv cannot be cast to $type") } diff --git a/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/generic/GenericSmtLibExprTransformer.java b/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/generic/GenericSmtLibExprTransformer.java index 9a2c4b60dd..9c80211e35 100644 --- a/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/generic/GenericSmtLibExprTransformer.java +++ b/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/generic/GenericSmtLibExprTransformer.java @@ -15,11 +15,6 @@ */ package hu.bme.mit.theta.solver.smtlib.impl.generic; -import static com.google.common.base.Preconditions.checkState; -import static hu.bme.mit.theta.core.decl.Decls.Param; -import static hu.bme.mit.theta.core.utils.ExprUtils.extractFuncAndArgs; -import static hu.bme.mit.theta.solver.smtlib.impl.generic.GenericSmtLibSymbolTable.encodeSymbol; - import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import hu.bme.mit.theta.common.DispatchTable; @@ -53,6 +48,7 @@ import hu.bme.mit.theta.solver.smtlib.solver.transformer.SmtLibSymbolTable; import hu.bme.mit.theta.solver.smtlib.solver.transformer.SmtLibTransformationManager; import kotlin.Pair; +import org.jetbrains.annotations.NotNull; import java.math.BigInteger; import java.util.Collection; @@ -60,7 +56,11 @@ import java.util.Map; import java.util.concurrent.ExecutionException; import java.util.stream.Collectors; -import org.jetbrains.annotations.NotNull; + +import static com.google.common.base.Preconditions.checkNotNull; +import static hu.bme.mit.theta.core.decl.Decls.Param; +import static hu.bme.mit.theta.core.utils.ExprUtils.extractFuncAndArgs; +import static hu.bme.mit.theta.solver.smtlib.impl.generic.GenericSmtLibSymbolTable.encodeSymbol; public class GenericSmtLibExprTransformer implements SmtLibExprTransformer { diff --git a/subprojects/xcfa/c2xcfa/src/main/java/hu/bme/mit/theta/c2xcfa/Utils.kt b/subprojects/xcfa/c2xcfa/src/main/java/hu/bme/mit/theta/c2xcfa/Utils.kt index 2a2a18cb7a..7336c726d0 100644 --- a/subprojects/xcfa/c2xcfa/src/main/java/hu/bme/mit/theta/c2xcfa/Utils.kt +++ b/subprojects/xcfa/c2xcfa/src/main/java/hu/bme/mit/theta/c2xcfa/Utils.kt @@ -125,7 +125,7 @@ fun getExpressionFromC( check(expr is Expr<*>) val signedType = CComplexType.getSignedInt(parseContext) if ( - expr is IteExpr<*> && expr.then == signedType.unitValue && expr.`else` == signedType.nullValue + expr is IteExpr<*> && expr.then == signedType.unitValue && expr.elze == signedType.nullValue ) { return expr.cond } else { diff --git a/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/checkers/ConfigToLassoValidationChecker.kt b/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/checkers/ConfigToLassoValidationChecker.kt index 18d63ddc15..cc27bf527c 100644 --- a/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/checkers/ConfigToLassoValidationChecker.kt +++ b/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/checkers/ConfigToLassoValidationChecker.kt @@ -29,7 +29,9 @@ import hu.bme.mit.theta.core.stmt.NonDetStmt import hu.bme.mit.theta.core.stmt.SequenceStmt import hu.bme.mit.theta.core.stmt.Stmt import hu.bme.mit.theta.core.stmt.Stmts.Assume -import hu.bme.mit.theta.core.type.booltype.BoolExprs.* +import hu.bme.mit.theta.core.type.booltype.BoolExprs.And +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Forall +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Imply import hu.bme.mit.theta.core.utils.ExprUtils import hu.bme.mit.theta.core.utils.PathUtils import hu.bme.mit.theta.core.utils.StmtUtils @@ -40,7 +42,9 @@ import hu.bme.mit.theta.graphsolver.patterns.constraints.MCM import hu.bme.mit.theta.solver.smtlib.impl.generic.GenericSmtLibSymbolTable import hu.bme.mit.theta.solver.smtlib.impl.generic.GenericSmtLibTransformationManager import hu.bme.mit.theta.solver.utils.WithPushPop -import hu.bme.mit.theta.xcfa.analysis.* +import hu.bme.mit.theta.xcfa.analysis.XcfaAction +import hu.bme.mit.theta.xcfa.analysis.XcfaPrec +import hu.bme.mit.theta.xcfa.analysis.XcfaState import hu.bme.mit.theta.xcfa.cli.params.LassoValidationConfig import hu.bme.mit.theta.xcfa.cli.params.XcfaConfig import hu.bme.mit.theta.xcfa.cli.utils.getSolver diff --git a/subprojects/xcfa/xcfa2chc/src/main/java/hu/bme/mit/theta/xcfa2chc/Xcfa2Chc.kt b/subprojects/xcfa/xcfa2chc/src/main/java/hu/bme/mit/theta/xcfa2chc/Xcfa2Chc.kt index 26c52f6553..ff25f77473 100644 --- a/subprojects/xcfa/xcfa2chc/src/main/java/hu/bme/mit/theta/xcfa2chc/Xcfa2Chc.kt +++ b/subprojects/xcfa/xcfa2chc/src/main/java/hu/bme/mit/theta/xcfa2chc/Xcfa2Chc.kt @@ -23,10 +23,12 @@ import hu.bme.mit.theta.core.plus import hu.bme.mit.theta.core.stmt.HavocStmt import hu.bme.mit.theta.core.stmt.SequenceStmt import hu.bme.mit.theta.core.type.Expr -import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.* +import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Eq +import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Neq import hu.bme.mit.theta.core.type.arraytype.ArrayExprs.Read import hu.bme.mit.theta.core.type.arraytype.ArrayType -import hu.bme.mit.theta.core.type.booltype.BoolExprs.* +import hu.bme.mit.theta.core.type.booltype.BoolExprs.And +import hu.bme.mit.theta.core.type.booltype.BoolExprs.True import hu.bme.mit.theta.core.type.booltype.BoolType import hu.bme.mit.theta.core.type.inttype.IntExprs.Add import hu.bme.mit.theta.core.type.inttype.IntExprs.Int From ee34453143a117445d9943b81d42962dce042f39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Csan=C3=A1d=20Telbisz?= Date: Tue, 24 Jun 2025 17:40:36 +0200 Subject: [PATCH 26/48] copyright, formatting, version --- build.gradle.kts | 2 +- .../bme/mit/theta/cfa/dsl/CfaExpression.java | 71 +- .../java/hu/bme/mit/theta/cfa/CfaTest.java | 4 +- .../algorithm/bounded/BoundedChecker.kt | 1 - .../algorithm/bounded/MonolithicL2S.kt | 3 +- .../hu/bme/mit/theta/analysis/ptr/PtrUtils.kt | 4 +- .../theta/analysis/multi/MultiAnalysisTest.kt | 4 +- .../bme/mit/theta/core/decl/BasicConstDecl.kt | 7 +- .../hu/bme/mit/theta/core/decl/ConstDecl.kt | 13 +- .../java/hu/bme/mit/theta/core/decl/Decl.kt | 9 +- .../java/hu/bme/mit/theta/core/decl/Decls.kt | 24 +- .../mit/theta/core/decl/IndexedConstDecl.kt | 30 +- .../hu/bme/mit/theta/core/decl/ParamDecl.kt | 19 +- .../hu/bme/mit/theta/core/decl/VarDecl.kt | 35 +- .../theta/core/serialization/Serializers.kt | 20 +- .../hu/bme/mit/theta/core/stmt/AssignStmt.kt | 64 +- .../hu/bme/mit/theta/core/stmt/AssumeStmt.kt | 40 +- .../hu/bme/mit/theta/core/stmt/HavocStmt.kt | 36 +- .../java/hu/bme/mit/theta/core/stmt/IfStmt.kt | 43 +- .../hu/bme/mit/theta/core/stmt/LoopStmt.kt | 51 +- .../mit/theta/core/stmt/MemoryAssignStmt.kt | 64 +- .../hu/bme/mit/theta/core/stmt/NonDetStmt.kt | 46 +- .../hu/bme/mit/theta/core/stmt/OrtStmt.kt | 46 +- .../bme/mit/theta/core/stmt/SequenceStmt.kt | 50 +- .../hu/bme/mit/theta/core/stmt/SkipStmt.kt | 25 +- .../java/hu/bme/mit/theta/core/stmt/Stmt.kt | 35 +- .../hu/bme/mit/theta/core/stmt/StmtVisitor.kt | 52 +- .../java/hu/bme/mit/theta/core/stmt/Stmts.kt | 73 +- .../hu/bme/mit/theta/core/type/BinaryExpr.kt | 47 +- .../java/hu/bme/mit/theta/core/type/Expr.kt | 74 +- .../hu/bme/mit/theta/core/type/LitExpr.kt | 5 +- .../bme/mit/theta/core/type/MultiaryExpr.kt | 41 +- .../hu/bme/mit/theta/core/type/NullaryExpr.kt | 17 +- .../java/hu/bme/mit/theta/core/type/Type.kt | 15 +- .../hu/bme/mit/theta/core/type/UnaryExpr.kt | 31 +- .../core/type/abstracttype/AbstractExprs.kt | 403 +++++----- .../theta/core/type/abstracttype/AddExpr.kt | 19 +- .../theta/core/type/abstracttype/Additive.kt | 12 +- .../theta/core/type/abstracttype/CastExpr.kt | 9 +- .../theta/core/type/abstracttype/Castable.kt | 2 +- .../theta/core/type/abstracttype/DivExpr.kt | 38 +- .../theta/core/type/abstracttype/Divisible.kt | 21 +- .../theta/core/type/abstracttype/EqExpr.kt | 42 +- .../core/type/abstracttype/Equational.kt | 20 +- .../theta/core/type/abstracttype/GeqExpr.kt | 46 +- .../theta/core/type/abstracttype/GtExpr.kt | 46 +- .../theta/core/type/abstracttype/LeqExpr.kt | 47 +- .../theta/core/type/abstracttype/LtExpr.kt | 46 +- .../theta/core/type/abstracttype/ModExpr.kt | 39 +- .../theta/core/type/abstracttype/MulExpr.kt | 36 +- .../core/type/abstracttype/Multiplicative.kt | 25 +- .../theta/core/type/abstracttype/NegExpr.kt | 36 +- .../theta/core/type/abstracttype/NeqExpr.kt | 46 +- .../theta/core/type/abstracttype/Ordered.kt | 31 +- .../theta/core/type/abstracttype/PosExpr.kt | 36 +- .../theta/core/type/abstracttype/RemExpr.kt | 39 +- .../theta/core/type/abstracttype/SubExpr.kt | 39 +- .../theta/core/type/anytype/Dereference.kt | 76 +- .../bme/mit/theta/core/type/anytype/Exprs.kt | 67 +- .../theta/core/type/anytype/InvalidLitExpr.kt | 11 +- .../mit/theta/core/type/anytype/IteExpr.kt | 108 ++- .../mit/theta/core/type/anytype/PrimeExpr.kt | 27 +- .../mit/theta/core/type/anytype/RefExpr.kt | 23 +- .../mit/theta/core/type/anytype/Reference.kt | 41 +- .../theta/core/type/arraytype/ArrayEqExpr.kt | 72 +- .../theta/core/type/arraytype/ArrayExprs.kt | 104 +-- .../core/type/arraytype/ArrayInitExpr.kt | 133 ++-- .../theta/core/type/arraytype/ArrayLitExpr.kt | 82 +- .../theta/core/type/arraytype/ArrayNeqExpr.kt | 69 +- .../core/type/arraytype/ArrayReadExpr.kt | 119 +-- .../theta/core/type/arraytype/ArrayType.kt | 64 +- .../core/type/arraytype/ArrayWriteExpr.kt | 127 +-- .../mit/theta/core/type/booltype/AndExpr.kt | 53 +- .../mit/theta/core/type/booltype/BoolExprs.kt | 66 +- .../theta/core/type/booltype/BoolLitExpr.kt | 52 +- .../mit/theta/core/type/booltype/BoolType.kt | 37 +- .../mit/theta/core/type/booltype/IffExpr.kt | 53 +- .../mit/theta/core/type/booltype/ImplyExpr.kt | 64 +- .../mit/theta/core/type/booltype/NotExpr.kt | 50 +- .../mit/theta/core/type/booltype/OrExpr.kt | 51 +- .../core/type/booltype/QuantifiedExpr.kt | 119 +-- .../core/type/booltype/SmartBoolExprs.kt | 96 ++- .../mit/theta/core/type/booltype/XorExpr.kt | 51 +- .../mit/theta/core/type/bvtype/BvAddExpr.kt | 33 +- .../mit/theta/core/type/bvtype/BvAndExpr.kt | 32 +- .../core/type/bvtype/BvArithShiftRightExpr.kt | 41 +- .../theta/core/type/bvtype/BvConcatExpr.kt | 31 +- .../mit/theta/core/type/bvtype/BvEqExpr.kt | 43 +- .../bme/mit/theta/core/type/bvtype/BvExprs.kt | 121 ++- .../theta/core/type/bvtype/BvExtractExpr.kt | 74 +- .../mit/theta/core/type/bvtype/BvLitExpr.kt | 721 +++++++++--------- .../core/type/bvtype/BvLogicShiftRightExpr.kt | 42 +- .../mit/theta/core/type/bvtype/BvMulExpr.kt | 32 +- .../mit/theta/core/type/bvtype/BvNegExpr.kt | 35 +- .../mit/theta/core/type/bvtype/BvNeqExpr.kt | 43 +- .../mit/theta/core/type/bvtype/BvNotExpr.kt | 35 +- .../mit/theta/core/type/bvtype/BvOrExpr.kt | 32 +- .../mit/theta/core/type/bvtype/BvPosExpr.kt | 35 +- .../core/type/bvtype/BvRotateLeftExpr.kt | 44 +- .../core/type/bvtype/BvRotateRightExpr.kt | 42 +- .../mit/theta/core/type/bvtype/BvSDivExpr.kt | 49 +- .../mit/theta/core/type/bvtype/BvSExtExpr.kt | 49 +- .../mit/theta/core/type/bvtype/BvSGeqExpr.kt | 42 +- .../mit/theta/core/type/bvtype/BvSGtExpr.kt | 41 +- .../mit/theta/core/type/bvtype/BvSLeqExpr.kt | 41 +- .../mit/theta/core/type/bvtype/BvSLtExpr.kt | 41 +- .../mit/theta/core/type/bvtype/BvSModExpr.kt | 49 +- .../mit/theta/core/type/bvtype/BvSRemExpr.kt | 50 +- .../theta/core/type/bvtype/BvShiftLeftExpr.kt | 44 +- .../core/type/bvtype/BvSignChangeExpr.kt | 42 +- .../mit/theta/core/type/bvtype/BvSubExpr.kt | 41 +- .../bme/mit/theta/core/type/bvtype/BvType.kt | 140 ++-- .../mit/theta/core/type/bvtype/BvUDivExpr.kt | 50 +- .../mit/theta/core/type/bvtype/BvUGeqExpr.kt | 42 +- .../mit/theta/core/type/bvtype/BvUGtExpr.kt | 41 +- .../mit/theta/core/type/bvtype/BvULeqExpr.kt | 41 +- .../mit/theta/core/type/bvtype/BvULtExpr.kt | 42 +- .../mit/theta/core/type/bvtype/BvURemExpr.kt | 50 +- .../mit/theta/core/type/bvtype/BvXorExpr.kt | 32 +- .../mit/theta/core/type/bvtype/BvZExtExpr.kt | 63 +- .../theta/core/type/enumtype/EnumEqExpr.kt | 38 +- .../theta/core/type/enumtype/EnumLitExpr.kt | 60 +- .../theta/core/type/enumtype/EnumNeqExpr.kt | 45 +- .../mit/theta/core/type/enumtype/EnumType.kt | 135 ++-- .../mit/theta/core/type/fptype/FpAbsExpr.kt | 42 +- .../mit/theta/core/type/fptype/FpAddExpr.kt | 50 +- .../theta/core/type/fptype/FpAssignExpr.kt | 42 +- .../mit/theta/core/type/fptype/FpDivExpr.kt | 53 +- .../mit/theta/core/type/fptype/FpEqExpr.kt | 54 +- .../bme/mit/theta/core/type/fptype/FpExprs.kt | 164 ++-- .../theta/core/type/fptype/FpFromBvExpr.kt | 86 +-- .../mit/theta/core/type/fptype/FpGeqExpr.kt | 54 +- .../mit/theta/core/type/fptype/FpGtExpr.kt | 42 +- .../core/type/fptype/FpIsInfiniteExpr.kt | 38 +- .../mit/theta/core/type/fptype/FpIsNanExpr.kt | 30 +- .../mit/theta/core/type/fptype/FpLeqExpr.kt | 42 +- .../mit/theta/core/type/fptype/FpLitExpr.kt | 390 +++++----- .../mit/theta/core/type/fptype/FpLtExpr.kt | 42 +- .../mit/theta/core/type/fptype/FpMaxExpr.kt | 61 +- .../mit/theta/core/type/fptype/FpMinExpr.kt | 61 +- .../mit/theta/core/type/fptype/FpMulExpr.kt | 50 +- .../mit/theta/core/type/fptype/FpNegExpr.kt | 31 +- .../mit/theta/core/type/fptype/FpNeqExpr.kt | 42 +- .../mit/theta/core/type/fptype/FpPosExpr.kt | 31 +- .../mit/theta/core/type/fptype/FpRemExpr.kt | 56 +- .../core/type/fptype/FpRoundToIntegralExpr.kt | 68 +- .../theta/core/type/fptype/FpRoundingMode.kt | 19 +- .../mit/theta/core/type/fptype/FpSqrtExpr.kt | 45 +- .../mit/theta/core/type/fptype/FpSubExpr.kt | 54 +- .../mit/theta/core/type/fptype/FpToBvExpr.kt | 72 +- .../mit/theta/core/type/fptype/FpToFpExpr.kt | 49 +- .../bme/mit/theta/core/type/fptype/FpType.kt | 100 +-- .../theta/core/type/functype/FuncAppExpr.kt | 95 ++- .../theta/core/type/functype/FuncLitExpr.kt | 66 +- .../mit/theta/core/type/functype/FuncType.kt | 43 +- .../mit/theta/core/type/inttype/IntAddExpr.kt | 46 +- .../mit/theta/core/type/inttype/IntDivExpr.kt | 56 +- .../mit/theta/core/type/inttype/IntEqExpr.kt | 35 +- .../mit/theta/core/type/inttype/IntExprs.kt | 70 +- .../mit/theta/core/type/inttype/IntGeqExpr.kt | 35 +- .../mit/theta/core/type/inttype/IntGtExpr.kt | 36 +- .../mit/theta/core/type/inttype/IntLeqExpr.kt | 35 +- .../mit/theta/core/type/inttype/IntLitExpr.kt | 157 ++-- .../mit/theta/core/type/inttype/IntLtExpr.kt | 36 +- .../mit/theta/core/type/inttype/IntModExpr.kt | 45 +- .../mit/theta/core/type/inttype/IntMulExpr.kt | 48 +- .../mit/theta/core/type/inttype/IntNegExpr.kt | 48 +- .../mit/theta/core/type/inttype/IntNeqExpr.kt | 36 +- .../mit/theta/core/type/inttype/IntPosExpr.kt | 48 +- .../mit/theta/core/type/inttype/IntRemExpr.kt | 56 +- .../mit/theta/core/type/inttype/IntSubExpr.kt | 56 +- .../theta/core/type/inttype/IntToRatExpr.kt | 40 +- .../mit/theta/core/type/inttype/IntType.kt | 80 +- .../mit/theta/core/type/rattype/RatAddExpr.kt | 58 +- .../mit/theta/core/type/rattype/RatDivExpr.kt | 66 +- .../mit/theta/core/type/rattype/RatEqExpr.kt | 35 +- .../mit/theta/core/type/rattype/RatExprs.kt | 114 ++- .../mit/theta/core/type/rattype/RatGeqExpr.kt | 35 +- .../mit/theta/core/type/rattype/RatGtExpr.kt | 35 +- .../mit/theta/core/type/rattype/RatLeqExpr.kt | 36 +- .../mit/theta/core/type/rattype/RatLitExpr.kt | 110 +-- .../mit/theta/core/type/rattype/RatLtExpr.kt | 35 +- .../mit/theta/core/type/rattype/RatMulExpr.kt | 50 +- .../mit/theta/core/type/rattype/RatNegExpr.kt | 46 +- .../mit/theta/core/type/rattype/RatNeqExpr.kt | 35 +- .../mit/theta/core/type/rattype/RatPosExpr.kt | 46 +- .../mit/theta/core/type/rattype/RatSubExpr.kt | 55 +- .../theta/core/type/rattype/RatToIntExpr.kt | 37 +- .../mit/theta/core/type/rattype/RatType.kt | 69 +- .../mit/theta/core/utils/ExprSimplifier.java | 2 - .../mit/theta/core/utils/ArrayTestUtils.java | 13 +- .../mit/theta/grammar/dsl/expr/ExprParser.kt | 33 +- .../pattern2expr/Pattern2ExprCompiler.kt | 20 +- .../javasmt/JavaSMTExprTransformer.java | 19 +- .../generic/GenericSmtLibExprTransformer.java | 21 +- .../generic/GenericSmtLibTermTransformer.java | 24 +- .../solver/z3legacy/Z3ExprTransformer.java | 4 +- .../solver/z3legacy/Z3TermTransformer.java | 1 - .../theta/solver/z3/Z3ExprTransformer.java | 7 +- .../theta/solver/z3/Z3TermTransformer.java | 34 +- .../mit/theta/c2xcfa/FrontendXcfaBuilder.kt | 10 +- .../hu/bme/mit/theta/llvm2xcfa/Utils.java | 19 +- .../xcfa/analysis/XcfaToMonolithicExpr.kt | 2 +- .../theta/xcfa/analysis/oc/XcfaOcChecker.kt | 8 +- .../mit/theta/xsts/dsl/XstsExpression.java | 35 +- 205 files changed, 5591 insertions(+), 5256 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 254f9c9242..ca723db3ac 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -29,7 +29,7 @@ buildscript { allprojects { group = "hu.bme.mit.theta" - version = "6.16.1" + version = "6.17.1" apply(from = rootDir.resolve("gradle/shared-with-buildSrc/mirrors.gradle.kts")) diff --git a/subprojects/cfa/cfa/src/main/java/hu/bme/mit/theta/cfa/dsl/CfaExpression.java b/subprojects/cfa/cfa/src/main/java/hu/bme/mit/theta/cfa/dsl/CfaExpression.java index 5d36ef998a..bc6ad9193f 100644 --- a/subprojects/cfa/cfa/src/main/java/hu/bme/mit/theta/cfa/dsl/CfaExpression.java +++ b/subprojects/cfa/cfa/src/main/java/hu/bme/mit/theta/cfa/dsl/CfaExpression.java @@ -15,6 +15,39 @@ */ package hu.bme.mit.theta.cfa.dsl; +import static com.google.common.base.Preconditions.*; +import static hu.bme.mit.theta.cfa.dsl.gen.CfaDslParser.*; +import static hu.bme.mit.theta.common.Utils.*; +import static hu.bme.mit.theta.core.decl.Decls.Param; +import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.*; +import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Add; +import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Div; +import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Eq; +import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Geq; +import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Gt; +import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Leq; +import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Lt; +import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Mul; +import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Neg; +import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Neq; +import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Pos; +import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Rem; +import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Sub; +import static hu.bme.mit.theta.core.type.anytype.Exprs.Prime; +import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.*; +import static hu.bme.mit.theta.core.type.booltype.BoolExprs.*; +import static hu.bme.mit.theta.core.type.booltype.BoolExprs.And; +import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Not; +import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Or; +import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Xor; +import static hu.bme.mit.theta.core.type.bvtype.BvExprs.*; +import static hu.bme.mit.theta.core.type.fptype.FpExprs.*; +import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; +import static hu.bme.mit.theta.core.type.rattype.RatExprs.Rat; +import static hu.bme.mit.theta.core.utils.ExprUtils.simplify; +import static hu.bme.mit.theta.core.utils.TypeUtils.*; +import static java.util.stream.Collectors.toList; + import com.google.common.collect.ImmutableList; import hu.bme.mit.theta.cfa.dsl.gen.CfaDslBaseVisitor; import hu.bme.mit.theta.common.dsl.BasicScope; @@ -41,9 +74,6 @@ import hu.bme.mit.theta.core.type.functype.FuncExprs; import hu.bme.mit.theta.core.type.inttype.IntLitExpr; import hu.bme.mit.theta.core.type.rattype.RatLitExpr; -import kotlin.Pair; -import org.antlr.v4.runtime.Token; - import java.math.BigInteger; import java.util.*; import java.util.regex.Matcher; @@ -51,39 +81,8 @@ import java.util.stream.Collectors; import java.util.stream.IntStream; import java.util.stream.Stream; - -import static com.google.common.base.Preconditions.*; -import static hu.bme.mit.theta.cfa.dsl.gen.CfaDslParser.*; -import static hu.bme.mit.theta.common.Utils.*; -import static hu.bme.mit.theta.core.decl.Decls.Param; -import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.*; -import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Add; -import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Div; -import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Eq; -import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Geq; -import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Gt; -import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Leq; -import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Lt; -import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Mul; -import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Neg; -import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Neq; -import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Pos; -import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Rem; -import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Sub; -import static hu.bme.mit.theta.core.type.anytype.Exprs.Prime; -import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.*; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.*; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.And; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Not; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Or; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Xor; -import static hu.bme.mit.theta.core.type.bvtype.BvExprs.*; -import static hu.bme.mit.theta.core.type.fptype.FpExprs.*; -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; -import static hu.bme.mit.theta.core.type.rattype.RatExprs.Rat; -import static hu.bme.mit.theta.core.utils.ExprUtils.simplify; -import static hu.bme.mit.theta.core.utils.TypeUtils.*; -import static java.util.stream.Collectors.toList; +import kotlin.Pair; +import org.antlr.v4.runtime.Token; final class CfaExpression { diff --git a/subprojects/cfa/cfa/src/test/java/hu/bme/mit/theta/cfa/CfaTest.java b/subprojects/cfa/cfa/src/test/java/hu/bme/mit/theta/cfa/CfaTest.java index 00cd0a437b..2559931d24 100644 --- a/subprojects/cfa/cfa/src/test/java/hu/bme/mit/theta/cfa/CfaTest.java +++ b/subprojects/cfa/cfa/src/test/java/hu/bme/mit/theta/cfa/CfaTest.java @@ -15,6 +15,8 @@ */ package hu.bme.mit.theta.cfa; +import static org.junit.Assert.assertEquals; + import hu.bme.mit.theta.core.decl.Decls; import hu.bme.mit.theta.core.decl.VarDecl; import hu.bme.mit.theta.core.stmt.Stmts; @@ -22,8 +24,6 @@ import hu.bme.mit.theta.core.type.inttype.IntType; import org.junit.Test; -import static org.junit.Assert.assertEquals; - public class CfaTest { @Test(expected = IllegalArgumentException.class) diff --git a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/bounded/BoundedChecker.kt b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/bounded/BoundedChecker.kt index fa0aba2d8d..50c5fd81a4 100644 --- a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/bounded/BoundedChecker.kt +++ b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/bounded/BoundedChecker.kt @@ -29,7 +29,6 @@ import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Eq import hu.bme.mit.theta.core.type.booltype.BoolExprs.True import hu.bme.mit.theta.core.type.booltype.BoolType -import hu.bme.mit.theta.core.type.booltype.SmartBoolExprs import hu.bme.mit.theta.core.type.booltype.SmartBoolExprs.And import hu.bme.mit.theta.core.type.booltype.SmartBoolExprs.Not import hu.bme.mit.theta.core.type.booltype.SmartBoolExprs.Or diff --git a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/bounded/MonolithicL2S.kt b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/bounded/MonolithicL2S.kt index 904cf13197..7eb7255eca 100644 --- a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/bounded/MonolithicL2S.kt +++ b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/bounded/MonolithicL2S.kt @@ -33,8 +33,7 @@ import hu.bme.mit.theta.core.utils.indexings.VarIndexingFactory import java.util.* private val reprEq = { e1: Expr<*>, e2: Expr<*> -> - if (e1.type is FpType) FpExprs.FpAssign(e1 as Expr, e2 as Expr) - else Eq(e1, e2) + if (e1.type is FpType) FpExprs.FpAssign(e1 as Expr, e2 as Expr) else Eq(e1, e2) } fun MonolithicExpr.createMonolithicL2S(): MonolithicExpr { diff --git a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/ptr/PtrUtils.kt b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/ptr/PtrUtils.kt index 920fac0043..c36d2f8302 100644 --- a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/ptr/PtrUtils.kt +++ b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/ptr/PtrUtils.kt @@ -129,9 +129,7 @@ fun Expr.uniqueDereferences( ): Pair, Expr> = if (this is Dereference<*, *, T>) { val ret = ArrayList() - require(this.uniquenessIdx == null) { - "Only non-pretransformed dereferences should be here" - } + require(this.uniquenessIdx == null) { "Only non-pretransformed dereferences should be here" } val arrayExpr = ExprUtils.simplify( array.uniqueDereferences(vargen, lookup).also { ret.addAll(it.first) }.second diff --git a/subprojects/common/analysis/src/test/kotlin/hu/bme/mit/theta/analysis/multi/MultiAnalysisTest.kt b/subprojects/common/analysis/src/test/kotlin/hu/bme/mit/theta/analysis/multi/MultiAnalysisTest.kt index 6b105bbc88..4c72d3e27b 100644 --- a/subprojects/common/analysis/src/test/kotlin/hu/bme/mit/theta/analysis/multi/MultiAnalysisTest.kt +++ b/subprojects/common/analysis/src/test/kotlin/hu/bme/mit/theta/analysis/multi/MultiAnalysisTest.kt @@ -61,7 +61,9 @@ class MultiAnalysisTest { InitFunc { listOf(NumberedState(0)) } override fun getTransFunc(): TransFunc = - TransFunc { state, action, prec -> listOf(NumberedState(state.num + 1)) } + TransFunc { state, action, prec -> + listOf(NumberedState(state.num + 1)) + } } class NumberedLTS : LTS { diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/BasicConstDecl.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/BasicConstDecl.kt index 5e5fdaab7f..d54d1e9755 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/BasicConstDecl.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/BasicConstDecl.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.decl import hu.bme.mit.theta.core.type.Type @@ -27,7 +26,5 @@ import kotlinx.serialization.Serializable */ @Serializable @SerialName("BasicConstDecl") -data class BasicConstDecl( - override val name: String, - override val type: DeclType -) : ConstDecl() \ No newline at end of file +data class BasicConstDecl(override val name: String, override val type: DeclType) : + ConstDecl() diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/ConstDecl.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/ConstDecl.kt index a64d599c38..55f7206553 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/ConstDecl.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/ConstDecl.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.decl import hu.bme.mit.theta.common.Utils @@ -29,10 +28,10 @@ import kotlinx.serialization.Serializable */ @Serializable abstract class ConstDecl : Decl() { - companion object { - private const val DECL_LABEL = "Const" - } + companion object { + private const val DECL_LABEL = "Const" + } - override fun toString(): String = - Utils.lispStringBuilder(DECL_LABEL).add(name).add(type).toString() -} \ No newline at end of file + override fun toString(): String = + Utils.lispStringBuilder(DECL_LABEL).add(name).add(type).toString() +} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/Decl.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/Decl.kt index a95e726c54..b0fea5542f 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/Decl.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/Decl.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.decl import hu.bme.mit.theta.core.type.Type @@ -24,8 +23,8 @@ import kotlinx.serialization.Serializable @Serializable abstract class Decl { - abstract val name: String - abstract val type: DeclType + abstract val name: String + abstract val type: DeclType - val ref: RefExpr by lazy { Ref(this) } -} \ No newline at end of file + val ref: RefExpr by lazy { Ref(this) } +} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/Decls.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/Decls.kt index b19a03c0cd..883ccbc8bf 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/Decls.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/Decls.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.decl import hu.bme.mit.theta.core.type.Type @@ -21,21 +20,12 @@ import hu.bme.mit.theta.core.type.Type /** Factory class to create declarations. */ @Suppress("FunctionName") object Decls { - /** - * Create a constant declaration with a given name and type. - */ - @JvmStatic - fun Const(name: String, type: T): ConstDecl = BasicConstDecl(name, type) + /** Create a constant declaration with a given name and type. */ + @JvmStatic fun Const(name: String, type: T): ConstDecl = BasicConstDecl(name, type) - /** - * Create a parameter declaration with a given name and type. - */ - @JvmStatic - fun Param(name: String, type: T): ParamDecl = ParamDecl(name, type) + /** Create a parameter declaration with a given name and type. */ + @JvmStatic fun Param(name: String, type: T): ParamDecl = ParamDecl(name, type) - /** - * Create a variable declaration with a given type. - */ - @JvmStatic - fun Var(name: String, type: T): VarDecl = VarDecl(name, type) -} \ No newline at end of file + /** Create a variable declaration with a given type. */ + @JvmStatic fun Var(name: String, type: T): VarDecl = VarDecl(name, type) +} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/IndexedConstDecl.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/IndexedConstDecl.kt index 7cf627e4eb..e3b8a451fb 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/IndexedConstDecl.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/IndexedConstDecl.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.decl import hu.bme.mit.theta.core.type.Type @@ -21,26 +20,23 @@ import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable /** - * A constant declaration that belongs to a variable ([VarDecl] declaration for a given index. - * For example, when unfolding a path, each variable will have a new constant for each step of the - * path. + * A constant declaration that belongs to a variable ([VarDecl] declaration for a given index. For + * example, when unfolding a path, each variable will have a new constant for each step of the path. * * @param */ @Serializable @SerialName("IndexedConstDecl") -data class IndexedConstDecl( - val varDecl: VarDecl, - val index: Int -) : ConstDecl() { - init { - require(index >= 0) { "Index must be non-negative" } - } +data class IndexedConstDecl(val varDecl: VarDecl, val index: Int) : + ConstDecl() { + init { + require(index >= 0) { "Index must be non-negative" } + } - companion object { - private const val NAME_FORMAT: String = "_%s:%d" - } + companion object { + private const val NAME_FORMAT: String = "_%s:%d" + } - override val name: String = String.format(NAME_FORMAT, varDecl.name, index) - override val type: DeclType = varDecl.type -} \ No newline at end of file + override val name: String = String.format(NAME_FORMAT, varDecl.name, index) + override val type: DeclType = varDecl.type +} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/ParamDecl.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/ParamDecl.kt index e10e86d118..8fc7bd802b 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/ParamDecl.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/ParamDecl.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.decl import hu.bme.mit.theta.common.Utils @@ -23,16 +22,14 @@ import kotlinx.serialization.Serializable @Serializable @SerialName(ParamDecl.DECL_LABEL) -data class ParamDecl( - override val name: String, - override val type: DeclType -) : Decl() { +data class ParamDecl(override val name: String, override val type: DeclType) : + Decl() { - companion object { + companion object { - internal const val DECL_LABEL: String = "Param" - } + internal const val DECL_LABEL: String = "Param" + } - override fun toString(): String = - Utils.lispStringBuilder(DECL_LABEL).add(name).add(type).toString() -} \ No newline at end of file + override fun toString(): String = + Utils.lispStringBuilder(DECL_LABEL).add(name).add(type).toString() +} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/VarDecl.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/VarDecl.kt index 1c33afb0e3..f6d3cbe58c 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/VarDecl.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/VarDecl.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.decl import hu.bme.mit.theta.common.Utils @@ -24,32 +23,30 @@ import kotlinx.serialization.Transient /** * Represents a variable declaration. Variables cannot be directly passed to the SMT solver, they - * must be replaced with constants for a given index ([IndexedConstDecl]). See also [hu.bme.mit.theta.core.utils.PathUtils]. + * must be replaced with constants for a given index ([IndexedConstDecl]). See also + * [hu.bme.mit.theta.core.utils.PathUtils]. * * @param */ @Serializable @SerialName(VarDecl.DECL_LABEL) -data class VarDecl( - override val name: String, - override val type: DeclType -) : Decl() { +data class VarDecl(override val name: String, override val type: DeclType) : + Decl() { - companion object { + companion object { - internal const val DECL_LABEL: String = "var" + internal const val DECL_LABEL: String = "var" - fun copyOf(from: VarDecl): VarDecl = VarDecl(from.name, from.type) - } + fun copyOf(from: VarDecl): VarDecl = VarDecl(from.name, from.type) + } - @Transient - private val indexToConst = mutableMapOf>() + @Transient private val indexToConst = mutableMapOf>() - fun getConstDecl(index: Int): IndexedConstDecl { - require(index >= 0) { "Index must be non-negative" } - return indexToConst.getOrPut(index) { IndexedConstDecl(this, index) } - } + fun getConstDecl(index: Int): IndexedConstDecl { + require(index >= 0) { "Index must be non-negative" } + return indexToConst.getOrPut(index) { IndexedConstDecl(this, index) } + } - override fun toString(): String = - Utils.lispStringBuilder(DECL_LABEL).add(name).add(type).toString() -} \ No newline at end of file + override fun toString(): String = + Utils.lispStringBuilder(DECL_LABEL).add(name).add(type).toString() +} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/serialization/Serializers.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/serialization/Serializers.kt index 08bbf452d2..41f6a26732 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/serialization/Serializers.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/serialization/Serializers.kt @@ -13,26 +13,26 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.serialization +import java.math.BigInteger import kotlinx.serialization.KSerializer import kotlinx.serialization.descriptors.PrimitiveKind import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor import kotlinx.serialization.descriptors.SerialDescriptor import kotlinx.serialization.encoding.Decoder import kotlinx.serialization.encoding.Encoder -import java.math.BigInteger object BigIntegerSerializer : KSerializer { - override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("BigInteger", PrimitiveKind.STRING) + override val descriptor: SerialDescriptor = + PrimitiveSerialDescriptor("BigInteger", PrimitiveKind.STRING) - override fun serialize(encoder: Encoder, value: BigInteger) { - encoder.encodeString(value.toString()) - } + override fun serialize(encoder: Encoder, value: BigInteger) { + encoder.encodeString(value.toString()) + } - override fun deserialize(decoder: Decoder): BigInteger { - return BigInteger(decoder.decodeString()) - } -} \ No newline at end of file + override fun deserialize(decoder: Decoder): BigInteger { + return BigInteger(decoder.decodeString()) + } +} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/AssignStmt.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/AssignStmt.kt index 7ec1a4ea99..6d1a9b25b3 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/AssignStmt.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/AssignStmt.kt @@ -1,44 +1,58 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package hu.bme.mit.theta.core.stmt import hu.bme.mit.theta.common.Utils +import hu.bme.mit.theta.core.decl.VarDecl import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.Type -import hu.bme.mit.theta.core.decl.VarDecl import hu.bme.mit.theta.core.utils.TypeUtils.cast import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable /** - * Assignment statement of the form `VARIABLE := EXPRESSION`. The statement updates the VARIABLE with - * the result of EXPRESSION. + * Assignment statement of the form `VARIABLE := EXPRESSION`. The statement updates the VARIABLE + * with the result of EXPRESSION. * * @param */ @Serializable @SerialName(AssignStmt.STMT_LABEL) -data class AssignStmt( - val varDecl: VarDecl, - val expr: Expr -) : Stmt { - - companion object { - - internal const val STMT_LABEL = "assign" - - @JvmStatic - fun of(lhs: VarDecl, rhs: Expr): AssignStmt = - AssignStmt(lhs, rhs) - - @JvmStatic - @Suppress("UNCHECKED_CAST") - fun create(lhs: VarDecl<*>, rhs: Expr<*>): AssignStmt { - val newLhs = lhs as VarDecl - val newRhs = cast(rhs, newLhs.type) - return of(newLhs, newRhs) - } +data class AssignStmt(val varDecl: VarDecl, val expr: Expr) : + Stmt { + + companion object { + + internal const val STMT_LABEL = "assign" + + @JvmStatic + fun of(lhs: VarDecl, rhs: Expr): AssignStmt = + AssignStmt(lhs, rhs) + + @JvmStatic + @Suppress("UNCHECKED_CAST") + fun create(lhs: VarDecl<*>, rhs: Expr<*>): AssignStmt { + val newLhs = lhs as VarDecl + val newRhs = cast(rhs, newLhs.type) + return of(newLhs, newRhs) } + } - override fun accept(visitor: StmtVisitor, param: P): R = visitor.visit(this, param) + override fun accept(visitor: StmtVisitor, param: P): R = visitor.visit(this, param) - override fun toString(): String = Utils.lispStringBuilder(STMT_LABEL).add(varDecl.name).add(expr).toString() + override fun toString(): String = + Utils.lispStringBuilder(STMT_LABEL).add(varDecl.name).add(expr).toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/AssumeStmt.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/AssumeStmt.kt index 8c19a32825..7843a9780c 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/AssumeStmt.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/AssumeStmt.kt @@ -1,3 +1,18 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package hu.bme.mit.theta.core.stmt import hu.bme.mit.theta.common.Utils @@ -9,28 +24,27 @@ import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable /** - * Assume statement of the form `[EXPRESSION]`, where EXPRESSION is a Boolean [Expr]. The - * statement is a guard that can only be passed if EXPRESSION evaluates to true. + * Assume statement of the form `[EXPRESSION]`, where EXPRESSION is a Boolean [Expr]. The statement + * is a guard that can only be passed if EXPRESSION evaluates to true. */ @Serializable @SerialName(AssumeStmt.STMT_LABEL) data class AssumeStmt(val cond: Expr) : Stmt { - companion object { + companion object { - internal const val STMT_LABEL = "assume" + internal const val STMT_LABEL = "assume" - @JvmStatic - fun of(cond: Expr): AssumeStmt = AssumeStmt(cond) + @JvmStatic fun of(cond: Expr): AssumeStmt = AssumeStmt(cond) - @JvmStatic - fun create(cond: Expr<*>): AssumeStmt { - val newCond = cast(cond, Bool()) - return of(newCond) - } + @JvmStatic + fun create(cond: Expr<*>): AssumeStmt { + val newCond = cast(cond, Bool()) + return of(newCond) } + } - override fun accept(visitor: StmtVisitor, param: P): R = visitor.visit(this, param) + override fun accept(visitor: StmtVisitor, param: P): R = visitor.visit(this, param) - override fun toString(): String = Utils.lispStringBuilder(STMT_LABEL).add(cond).toString() + override fun toString(): String = Utils.lispStringBuilder(STMT_LABEL).add(cond).toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/HavocStmt.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/HavocStmt.kt index c1a1ecf3a4..ec1759001d 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/HavocStmt.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/HavocStmt.kt @@ -1,10 +1,25 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package hu.bme.mit.theta.core.stmt import hu.bme.mit.theta.common.Utils -import hu.bme.mit.theta.core.type.Type import hu.bme.mit.theta.core.decl.VarDecl -import kotlinx.serialization.Serializable +import hu.bme.mit.theta.core.type.Type import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable /** * Havoc statement of the form `havoc VARIABLE`, which performs a non-deterministic assignment to @@ -14,19 +29,16 @@ import kotlinx.serialization.SerialName */ @Serializable @SerialName(HavocStmt.STMT_LABEL) -data class HavocStmt( - val varDecl: VarDecl -) : Stmt { +data class HavocStmt(val varDecl: VarDecl) : Stmt { - companion object { + companion object { - internal const val STMT_LABEL = "havoc" + internal const val STMT_LABEL = "havoc" - @JvmStatic - fun of(varDecl: VarDecl): HavocStmt = HavocStmt(varDecl) - } + @JvmStatic fun of(varDecl: VarDecl): HavocStmt = HavocStmt(varDecl) + } - override fun accept(visitor: StmtVisitor, param: P): R = visitor.visit(this, param) + override fun accept(visitor: StmtVisitor, param: P): R = visitor.visit(this, param) - override fun toString(): String = Utils.lispStringBuilder(STMT_LABEL).add(varDecl.name).toString() + override fun toString(): String = Utils.lispStringBuilder(STMT_LABEL).add(varDecl.name).toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/IfStmt.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/IfStmt.kt index 6a25d37706..71498d9978 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/IfStmt.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/IfStmt.kt @@ -1,3 +1,18 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package hu.bme.mit.theta.core.stmt import hu.bme.mit.theta.common.Utils @@ -8,28 +23,24 @@ import kotlinx.serialization.Serializable /** * If-then-else statement of the form `if (COND) THEN [else ELSE]`. The statement first evaluates - * the condition COND, and based on its value, executes either the THEN or the ELSE branch. - * The ELSE branch is optional and defaults to a skip statement. + * the condition COND, and based on its value, executes either the THEN or the ELSE branch. The ELSE + * branch is optional and defaults to a skip statement. */ @Serializable @SerialName(IfStmt.STMT_LABEL) -data class IfStmt( - val cond: Expr, - val then: Stmt, - val elze: Stmt -) : Stmt { +data class IfStmt(val cond: Expr, val then: Stmt, val elze: Stmt) : Stmt { - companion object { - internal const val STMT_LABEL = "if" + companion object { + internal const val STMT_LABEL = "if" - @JvmStatic - fun of(cond: Expr, then: Stmt, elze: Stmt): IfStmt = IfStmt(cond, then, elze) + @JvmStatic + fun of(cond: Expr, then: Stmt, elze: Stmt): IfStmt = IfStmt(cond, then, elze) - @JvmStatic - fun of(cond: Expr, then: Stmt): IfStmt = IfStmt(cond, then, SkipStmt) - } + @JvmStatic fun of(cond: Expr, then: Stmt): IfStmt = IfStmt(cond, then, SkipStmt) + } - override fun accept(visitor: StmtVisitor, param: P): R = visitor.visit(this, param) + override fun accept(visitor: StmtVisitor, param: P): R = visitor.visit(this, param) - override fun toString(): String = Utils.lispStringBuilder(STMT_LABEL).add(cond).add(then).add(elze).toString() + override fun toString(): String = + Utils.lispStringBuilder(STMT_LABEL).add(cond).add(then).add(elze).toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/LoopStmt.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/LoopStmt.kt index e1680afc3b..7a1b3e9c3f 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/LoopStmt.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/LoopStmt.kt @@ -1,3 +1,18 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package hu.bme.mit.theta.core.stmt import hu.bme.mit.theta.common.Utils @@ -14,28 +29,26 @@ import kotlinx.serialization.Serializable @Serializable @SerialName(LoopStmt.STMT_LABEL) data class LoopStmt( - val stmt: Stmt, - val loopVariable: VarDecl, - val from: Expr, - val to: Expr + val stmt: Stmt, + val loopVariable: VarDecl, + val from: Expr, + val to: Expr, ) : Stmt { - companion object { - internal const val STMT_LABEL = "loop" + companion object { + internal const val STMT_LABEL = "loop" - @JvmStatic - fun of( - stmt: Stmt, - loopVar: VarDecl, - from: Expr, - to: Expr - ): LoopStmt = LoopStmt(stmt, loopVar, from, to) - } + @JvmStatic + fun of( + stmt: Stmt, + loopVar: VarDecl, + from: Expr, + to: Expr, + ): LoopStmt = LoopStmt(stmt, loopVar, from, to) + } - override fun accept(visitor: StmtVisitor, param: P): R = visitor.visit(this, param) + override fun accept(visitor: StmtVisitor, param: P): R = visitor.visit(this, param) - override fun toString(): String = - Utils.lispStringBuilder(STMT_LABEL) - .add("$loopVariable from $from to $to $stmt") - .toString(); + override fun toString(): String = + Utils.lispStringBuilder(STMT_LABEL).add("$loopVariable from $from to $to $stmt").toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/MemoryAssignStmt.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/MemoryAssignStmt.kt index bc8bd3e172..dc0d78deb8 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/MemoryAssignStmt.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/MemoryAssignStmt.kt @@ -1,3 +1,18 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package hu.bme.mit.theta.core.stmt import hu.bme.mit.theta.common.Utils @@ -18,34 +33,33 @@ import kotlinx.serialization.Serializable @Serializable @SerialName(MemoryAssignStmt.STMT_LABEL) data class MemoryAssignStmt( - val deref: Dereference, - val expr: Expr + val deref: Dereference, + val expr: Expr, ) : Stmt { - companion object { - - internal const val STMT_LABEL = "memassign" - - @JvmStatic - fun of( - deref: Dereference, - expr: Expr - ): MemoryAssignStmt = MemoryAssignStmt(deref, expr) - - @JvmStatic - @Suppress("UNCHECKED_CAST") - fun create( - deref: Dereference, - expr: Expr - ): MemoryAssignStmt { - val typedDeref = deref as Dereference - return of(typedDeref, expr) - } + companion object { + + internal const val STMT_LABEL = "memassign" + + @JvmStatic + fun of( + deref: Dereference, + expr: Expr, + ): MemoryAssignStmt = MemoryAssignStmt(deref, expr) + + @JvmStatic + @Suppress("UNCHECKED_CAST") + fun create( + deref: Dereference, + expr: Expr, + ): MemoryAssignStmt { + val typedDeref = deref as Dereference + return of(typedDeref, expr) } + } - override fun accept(visitor: StmtVisitor, param: P): R = - visitor.visit(this, param) + override fun accept(visitor: StmtVisitor, param: P): R = visitor.visit(this, param) - override fun toString(): String = - Utils.lispStringBuilder(STMT_LABEL).add(deref).add(expr).toString() + override fun toString(): String = + Utils.lispStringBuilder(STMT_LABEL).add(deref).add(expr).toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/NonDetStmt.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/NonDetStmt.kt index 6048a446a6..27bcfef622 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/NonDetStmt.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/NonDetStmt.kt @@ -1,3 +1,18 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package hu.bme.mit.theta.core.stmt import hu.bme.mit.theta.common.Utils @@ -10,29 +25,24 @@ import kotlinx.serialization.Serializable */ @Serializable @SerialName(NonDetStmt.STMT_LABEL) -data class NonDetStmt( - val stmts: List -) : Stmt { +data class NonDetStmt(val stmts: List) : Stmt { - init { - check(stmts.isNotEmpty()) - } + init { + check(stmts.isNotEmpty()) + } - companion object { + companion object { - internal const val STMT_LABEL = "nondet" + internal const val STMT_LABEL = "nondet" - @JvmStatic - fun of(stmts: List): NonDetStmt { - val stmtList = stmts.ifEmpty { - listOf(SkipStmt) - } - return NonDetStmt(stmtList) - } + @JvmStatic + fun of(stmts: List): NonDetStmt { + val stmtList = stmts.ifEmpty { listOf(SkipStmt) } + return NonDetStmt(stmtList) } + } - override fun accept(visitor: StmtVisitor, param: P): R = - visitor.visit(this, param) + override fun accept(visitor: StmtVisitor, param: P): R = visitor.visit(this, param) - override fun toString(): String = Utils.lispStringBuilder(STMT_LABEL).addAll(stmts).toString() + override fun toString(): String = Utils.lispStringBuilder(STMT_LABEL).addAll(stmts).toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/OrtStmt.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/OrtStmt.kt index 8a9fe1c3ee..542c872312 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/OrtStmt.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/OrtStmt.kt @@ -1,3 +1,18 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package hu.bme.mit.theta.core.stmt import hu.bme.mit.theta.common.Utils @@ -10,29 +25,24 @@ import kotlinx.serialization.Serializable */ @Serializable @SerialName(OrtStmt.STMT_LABEL) -data class OrtStmt( - val stmts: List -) : Stmt { +data class OrtStmt(val stmts: List) : Stmt { - init { - check(stmts.isNotEmpty()) - } + init { + check(stmts.isNotEmpty()) + } - companion object { + companion object { - internal const val STMT_LABEL = "ort" + internal const val STMT_LABEL = "ort" - @JvmStatic - fun of(stmts: List): OrtStmt { - val stmtList = stmts.ifEmpty { - listOf(SkipStmt) - } - return OrtStmt(stmtList) - } + @JvmStatic + fun of(stmts: List): OrtStmt { + val stmtList = stmts.ifEmpty { listOf(SkipStmt) } + return OrtStmt(stmtList) } + } - override fun accept(visitor: StmtVisitor, param: P): R = - visitor.visit(this, param) + override fun accept(visitor: StmtVisitor, param: P): R = visitor.visit(this, param) - override fun toString(): String = Utils.lispStringBuilder(STMT_LABEL).addAll(stmts).toString() + override fun toString(): String = Utils.lispStringBuilder(STMT_LABEL).addAll(stmts).toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/SequenceStmt.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/SequenceStmt.kt index 7d54fdd2a5..3ff4cdabbe 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/SequenceStmt.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/SequenceStmt.kt @@ -1,3 +1,18 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package hu.bme.mit.theta.core.stmt import hu.bme.mit.theta.common.Utils @@ -5,34 +20,29 @@ import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable /** - * Sequence statement of the form `sequence { STMT1; STMT2; ... }`. The statement executes all of the - * given statements in sequence. + * Sequence statement of the form `sequence { STMT1; STMT2; ... }`. The statement executes all of + * the given statements in sequence. */ @Serializable @SerialName(SequenceStmt.STMT_LABEL) -data class SequenceStmt( - val stmts: List -) : Stmt { +data class SequenceStmt(val stmts: List) : Stmt { - init { - check(stmts.isNotEmpty()) - } + init { + check(stmts.isNotEmpty()) + } - companion object { + companion object { - internal const val STMT_LABEL = "sequence" + internal const val STMT_LABEL = "sequence" - @JvmStatic - fun of(stmts: List): SequenceStmt { - val stmtList = stmts.ifEmpty { - listOf(SkipStmt) - } - return SequenceStmt(stmtList) - } + @JvmStatic + fun of(stmts: List): SequenceStmt { + val stmtList = stmts.ifEmpty { listOf(SkipStmt) } + return SequenceStmt(stmtList) } + } - override fun accept(visitor: StmtVisitor, param: P): R = - visitor.visit(this, param) + override fun accept(visitor: StmtVisitor, param: P): R = visitor.visit(this, param) - override fun toString(): String = Utils.lispStringBuilder().addAll(stmts).toString() + override fun toString(): String = Utils.lispStringBuilder().addAll(stmts).toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/SkipStmt.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/SkipStmt.kt index a19c4da9a6..dd455c69eb 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/SkipStmt.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/SkipStmt.kt @@ -1,3 +1,18 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package hu.bme.mit.theta.core.stmt import kotlinx.serialization.SerialName @@ -7,13 +22,11 @@ import kotlinx.serialization.Serializable @SerialName(SkipStmt.STMT_LABEL) data object SkipStmt : Stmt { - internal const val STMT_LABEL = "skip" + internal const val STMT_LABEL = "skip" - override fun accept(visitor: StmtVisitor, param: P): R = - visitor.visit(this, param) + override fun accept(visitor: StmtVisitor, param: P): R = visitor.visit(this, param) - @JvmStatic - fun getInstance(): SkipStmt = this + @JvmStatic fun getInstance(): SkipStmt = this - override fun toString(): String = STMT_LABEL + override fun toString(): String = STMT_LABEL } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/Stmt.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/Stmt.kt index 0c01db3923..4765d9df20 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/Stmt.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/Stmt.kt @@ -1,18 +1,31 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package hu.bme.mit.theta.core.stmt import kotlinx.serialization.Polymorphic -/** - * Base class for all statements in the Theta framework. - * All subclasses must be serializable. - */ +/** Base class for all statements in the Theta framework. All subclasses must be serializable. */ @Polymorphic interface Stmt { - /** - * Accepts a visitor and returns the result of the visit. - * @param visitor The visitor to accept - * @param param Additional parameter for the visitor - * @return The result of the visit - */ - fun accept(visitor: StmtVisitor, param: P): R + /** + * Accepts a visitor and returns the result of the visit. + * + * @param visitor The visitor to accept + * @param param Additional parameter for the visitor + * @return The result of the visit + */ + fun accept(visitor: StmtVisitor, param: P): R } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/StmtVisitor.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/StmtVisitor.kt index 7e0cd39462..f13aafb8a7 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/StmtVisitor.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/StmtVisitor.kt @@ -1,25 +1,49 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package hu.bme.mit.theta.core.stmt import hu.bme.mit.theta.core.type.Type /** * Visitor interface for the statement hierarchy. + * * @param

The type of the parameter * @param The return type of the visit operations */ interface StmtVisitor { - fun visit(stmt: SkipStmt, param: P): R - fun visit(stmt: AssumeStmt, param: P): R - fun visit(stmt: AssignStmt, param: P): R - fun visit( - stmt: MemoryAssignStmt, - param: P - ): R - - fun visit(stmt: HavocStmt, param: P): R - fun visit(stmt: SequenceStmt, param: P): R - fun visit(stmt: NonDetStmt, param: P): R - fun visit(stmt: OrtStmt, param: P): R - fun visit(stmt: LoopStmt, param: P): R - fun visit(stmt: IfStmt, param: P): R + fun visit(stmt: SkipStmt, param: P): R + + fun visit(stmt: AssumeStmt, param: P): R + + fun visit(stmt: AssignStmt, param: P): R + + fun visit( + stmt: MemoryAssignStmt, + param: P, + ): R + + fun visit(stmt: HavocStmt, param: P): R + + fun visit(stmt: SequenceStmt, param: P): R + + fun visit(stmt: NonDetStmt, param: P): R + + fun visit(stmt: OrtStmt, param: P): R + + fun visit(stmt: LoopStmt, param: P): R + + fun visit(stmt: IfStmt, param: P): R } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/Stmts.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/Stmts.kt index 2f2e075fca..6a23456068 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/Stmts.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/Stmts.kt @@ -1,3 +1,18 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package hu.bme.mit.theta.core.stmt import hu.bme.mit.theta.core.decl.VarDecl @@ -14,37 +29,29 @@ import hu.bme.mit.theta.core.type.booltype.BoolType @Suppress("FunctionName") object Stmts { - /** Create a skip statement */ - @JvmStatic - fun Skip(): SkipStmt = SkipStmt - - /** Create an assume statement */ - @JvmStatic - fun Assume(cond: Expr): AssumeStmt = AssumeStmt(cond) - - /** Create an assignment statement */ - @JvmStatic - fun Assign( - lhs: VarDecl, - rhs: Expr - ): AssignStmt = AssignStmt.of(lhs, rhs) - - /** Create a memory assignment statement */ - @JvmStatic - fun

MemoryAssign( - deref: Dereference, - expr: Expr - ): MemoryAssignStmt = MemoryAssignStmt.of(deref, expr) - - /** Create a havoc statement */ - @JvmStatic - fun Havoc(varDecl: VarDecl): HavocStmt = HavocStmt.of(varDecl) - - /** Create a sequence statement */ - @JvmStatic - fun Sequence(stmts: List): SequenceStmt = SequenceStmt.of(stmts) - - /** Create a non-deterministic choice statement */ - @JvmStatic - fun NonDet(stmts: List): NonDetStmt = NonDetStmt.of(stmts) + /** Create a skip statement */ + @JvmStatic fun Skip(): SkipStmt = SkipStmt + + /** Create an assume statement */ + @JvmStatic fun Assume(cond: Expr): AssumeStmt = AssumeStmt(cond) + + /** Create an assignment statement */ + @JvmStatic + fun Assign(lhs: VarDecl, rhs: Expr): AssignStmt = AssignStmt.of(lhs, rhs) + + /** Create a memory assignment statement */ + @JvmStatic + fun

MemoryAssign( + deref: Dereference, + expr: Expr, + ): MemoryAssignStmt = MemoryAssignStmt.of(deref, expr) + + /** Create a havoc statement */ + @JvmStatic fun Havoc(varDecl: VarDecl): HavocStmt = HavocStmt.of(varDecl) + + /** Create a sequence statement */ + @JvmStatic fun Sequence(stmts: List): SequenceStmt = SequenceStmt.of(stmts) + + /** Create a non-deterministic choice statement */ + @JvmStatic fun NonDet(stmts: List): NonDetStmt = NonDetStmt.of(stmts) } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/BinaryExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/BinaryExpr.kt index b71253b548..d500c8b23b 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/BinaryExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/BinaryExpr.kt @@ -28,33 +28,38 @@ import kotlinx.serialization.Serializable @Serializable abstract class BinaryExpr : Expr { - abstract val leftOp: Expr - abstract val rightOp: Expr + abstract val leftOp: Expr + abstract val rightOp: Expr - override val ops: List> get() = listOf(leftOp, rightOp) + override val ops: List> + get() = listOf(leftOp, rightOp) - abstract val operatorLabel: String + abstract val operatorLabel: String - override fun withOps(ops: List>): Expr { - require(ops.size == 2) { "Operands must have size 2 for binary expression" } - val opType = leftOp.type - val newLeftOp = TypeUtils.cast(ops[0], opType) - val newRightOp = TypeUtils.cast(ops[1], opType) - return with(newLeftOp, newRightOp) - } + override fun withOps(ops: List>): Expr { + require(ops.size == 2) { "Operands must have size 2 for binary expression" } + val opType = leftOp.type + val newLeftOp = TypeUtils.cast(ops[0], opType) + val newRightOp = TypeUtils.cast(ops[1], opType) + return with(newLeftOp, newRightOp) + } - open fun with(leftOp: Expr, rightOp: Expr): BinaryExpr = - if (leftOp == this.leftOp && rightOp == this.rightOp) { - this - } else { - new(leftOp, rightOp) - } + open fun with(leftOp: Expr, rightOp: Expr): BinaryExpr = + if (leftOp == this.leftOp && rightOp == this.rightOp) { + this + } else { + new(leftOp, rightOp) + } - protected abstract fun new(leftOp: Expr, rightOp: Expr): BinaryExpr + protected abstract fun new( + leftOp: Expr, + rightOp: Expr, + ): BinaryExpr - open fun withLeftOp(leftOp: Expr): BinaryExpr = with(leftOp, rightOp) + open fun withLeftOp(leftOp: Expr): BinaryExpr = with(leftOp, rightOp) - open fun withRightOp(rightOp: Expr): BinaryExpr = with(leftOp, rightOp) + open fun withRightOp(rightOp: Expr): BinaryExpr = with(leftOp, rightOp) - override fun toString(): String = Utils.lispStringBuilder(operatorLabel).add(leftOp).add(rightOp).toString() + override fun toString(): String = + Utils.lispStringBuilder(operatorLabel).add(leftOp).add(rightOp).toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/Expr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/Expr.kt index 4de250ccaf..75cad6b06d 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/Expr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/Expr.kt @@ -17,7 +17,6 @@ package hu.bme.mit.theta.core.type import hu.bme.mit.theta.core.model.Valuation import kotlinx.serialization.Polymorphic -import kotlinx.serialization.Serializable /** * Base class for all expressions in the Theta framework. @@ -27,48 +26,45 @@ import kotlinx.serialization.Serializable @Polymorphic interface Expr { - /** - * Returns the arity (number of operands) of this expression. - */ - val arity: Int - get() = ops.size + /** Returns the arity (number of operands) of this expression. */ + val arity: Int + get() = ops.size - /** - * Returns the type of this expression. - */ - val type: ExprType + /** Returns the type of this expression. */ + val type: ExprType - /** - * Returns the list of operands of this expression. - */ - val ops: List> + /** Returns the list of operands of this expression. */ + val ops: List> - /** - * Evaluates this expression with the given valuation. - * @param val The valuation to use for evaluation - * @return The result of the evaluation as a literal expression - */ - fun eval(`val`: Valuation): LitExpr + /** + * Evaluates this expression with the given valuation. + * + * @param val The valuation to use for evaluation + * @return The result of the evaluation as a literal expression + */ + fun eval(`val`: Valuation): LitExpr - /** - * Checks if this expression is invalid. - * An expression is invalid if any of its operands are invalid. - */ - val isInvalid: Boolean - get() = ops.any { it.isInvalid } + /** + * Checks if this expression is invalid. An expression is invalid if any of its operands are + * invalid. + */ + val isInvalid: Boolean + get() = ops.any { it.isInvalid } - /** - * Creates a new expression of the same type with the given operands. - * @param ops The new operands - * @return A new expression with the given operands - */ - fun withOps(ops: List>): Expr + /** + * Creates a new expression of the same type with the given operands. + * + * @param ops The new operands + * @return A new expression with the given operands + */ + fun withOps(ops: List>): Expr - /** - * Applies the given function to each operand of this expression and returns a new expression - * with the results. - * @param function The function to apply to each operand - * @return A new expression with the transformed operands - */ - fun map(function: (Expr<*>) -> Expr<*>): Expr = withOps(ops.map(function)) + /** + * Applies the given function to each operand of this expression and returns a new expression with + * the results. + * + * @param function The function to apply to each operand + * @return A new expression with the transformed operands + */ + fun map(function: (Expr<*>) -> Expr<*>): Expr = withOps(ops.map(function)) } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/LitExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/LitExpr.kt index 16a5fc9090..eda4e0013a 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/LitExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/LitExpr.kt @@ -15,14 +15,11 @@ */ package hu.bme.mit.theta.core.type -import hu.bme.mit.theta.core.model.Valuation import kotlinx.serialization.Polymorphic -import kotlinx.serialization.Serializable /** * Interface for literal expressions (constants). * * @param ExprType The type of the literal, must be a subtype of [Type] */ -@Polymorphic -interface LitExpr : Expr +@Polymorphic interface LitExpr : Expr diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/MultiaryExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/MultiaryExpr.kt index 035e55710e..7df1a2bcee 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/MultiaryExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/MultiaryExpr.kt @@ -28,28 +28,29 @@ import kotlinx.serialization.Serializable @Serializable abstract class MultiaryExpr : Expr { - abstract override val ops: List> - - abstract val operatorLabel: String - - override fun withOps(ops: List>): MultiaryExpr { - if (ops.isEmpty()) { - return with(listOf()) - } else { - val opType: OpType = this.ops[0].type - val newOps: List> = ops.map { op: Expr<*> -> TypeUtils.cast(op, opType) } - return with(newOps) - } + abstract override val ops: List> + + abstract val operatorLabel: String + + override fun withOps(ops: List>): MultiaryExpr { + if (ops.isEmpty()) { + return with(listOf()) + } else { + val opType: OpType = this.ops[0].type + val newOps: List> = ops.map { op: Expr<*> -> TypeUtils.cast(op, opType) } + return with(newOps) } + } - override fun toString(): String = Utils.lispStringBuilder(operatorLabel).body().addAll(ops).toString() + override fun toString(): String = + Utils.lispStringBuilder(operatorLabel).body().addAll(ops).toString() - open fun with(ops: Iterable>): MultiaryExpr = - if (ops.toList() == this.ops) { - this - } else { - new(ops.toList()) - } + open fun with(ops: Iterable>): MultiaryExpr = + if (ops.toList() == this.ops) { + this + } else { + new(ops.toList()) + } - protected abstract fun new(ops: List>): MultiaryExpr + protected abstract fun new(ops: List>): MultiaryExpr } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/NullaryExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/NullaryExpr.kt index 61f7ba9a0d..4d7a3befa0 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/NullaryExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/NullaryExpr.kt @@ -24,13 +24,14 @@ import kotlinx.serialization.Serializable */ @Serializable abstract class NullaryExpr : Expr { - override val arity: Int get() = 0 - - override val ops: List> - get() = emptyList() + override val arity: Int + get() = 0 - override fun withOps(ops: List>): Expr { - require(ops.isEmpty()) { "Operands must be empty for nullary expression" } - return this - } + override val ops: List> + get() = emptyList() + + override fun withOps(ops: List>): Expr { + require(ops.isEmpty()) { "Operands must be empty for nullary expression" } + return this + } } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/Type.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/Type.kt index de2967d69d..8a8fe7f70d 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/Type.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/Type.kt @@ -18,14 +18,15 @@ package hu.bme.mit.theta.core.type import kotlinx.serialization.Polymorphic /** - * Base class for all types in the Theta framework. - * Represents the type of expressions and variables. + * Base class for all types in the Theta framework. Represents the type of expressions and + * variables. */ @Polymorphic interface Type { - /** - * Returns the size of the domain of this type. - * @return The domain size of this type - */ - val domainSize: DomainSize + /** + * Returns the size of the domain of this type. + * + * @return The domain size of this type + */ + val domainSize: DomainSize } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/UnaryExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/UnaryExpr.kt index 0584a50ba3..09e7ebd0ad 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/UnaryExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/UnaryExpr.kt @@ -28,26 +28,27 @@ import kotlinx.serialization.Serializable @Serializable abstract class UnaryExpr : Expr { - abstract val op: Expr + abstract val op: Expr - override val arity: Int get() = 1 + override val arity: Int + get() = 1 - override val ops: List> - get() = listOf(op) + override val ops: List> + get() = listOf(op) - override fun withOps(ops: List>): Expr { - require(ops.size == 1) { "Operands must have size 1 for unary expression" } - val opType = op.type - val newOp = TypeUtils.cast(ops[0], opType) - return with(newOp) - } + override fun withOps(ops: List>): Expr { + require(ops.size == 1) { "Operands must have size 1 for unary expression" } + val opType = op.type + val newOp = TypeUtils.cast(ops[0], opType) + return with(newOp) + } - override fun toString(): String = Utils.lispStringBuilder(operatorLabel).body().add(op).toString() + override fun toString(): String = Utils.lispStringBuilder(operatorLabel).body().add(op).toString() - open fun with(op: Expr): UnaryExpr = - if (op == this.op) this else new(op) + open fun with(op: Expr): UnaryExpr = + if (op == this.op) this else new(op) - protected abstract fun new(op: Expr): UnaryExpr + protected abstract fun new(op: Expr): UnaryExpr - abstract val operatorLabel: String + abstract val operatorLabel: String } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/AbstractExprs.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/AbstractExprs.kt index d4e40051b3..90279182b4 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/AbstractExprs.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/AbstractExprs.kt @@ -1,3 +1,18 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package hu.bme.mit.theta.core.type.abstracttype import hu.bme.mit.theta.common.Try @@ -8,220 +23,198 @@ import hu.bme.mit.theta.core.type.anytype.Exprs import hu.bme.mit.theta.core.type.anytype.IteExpr import hu.bme.mit.theta.core.type.booltype.BoolType -/** - * Factory and utility methods for abstract expressions over multiple types. - */ +/** Factory and utility methods for abstract expressions over multiple types. */ @Suppress("FunctionName") object AbstractExprs { - @JvmStatic - // General - fun Ite(cond: Expr, then: Expr<*>, elze: Expr<*>): IteExpr<*> { - val newOps: Pair, Expr> = unify(then, elze) - val newThen = newOps.first - val newElse = newOps.second - return Exprs.Ite(cond, newThen, newElse) - } - - @JvmStatic - // Additive - fun > Add(ops: Iterable>): AddExpr { - val opList = ops.toList() - require(opList.isNotEmpty()) - val head = Utils.head(opList) - val tail = Utils.tail(opList) - return combineAdd(head, tail) + @JvmStatic + // General + fun Ite(cond: Expr, then: Expr<*>, elze: Expr<*>): IteExpr<*> { + val newOps: Pair, Expr> = unify(then, elze) + val newThen = newOps.first + val newElse = newOps.second + return Exprs.Ite(cond, newThen, newElse) + } + + @JvmStatic + // Additive + fun > Add(ops: Iterable>): AddExpr { + val opList = ops.toList() + require(opList.isNotEmpty()) + val head = Utils.head(opList) + val tail = Utils.tail(opList) + return combineAdd(head, tail) + } + + private fun > combineAdd(head: Expr<*>, tail: List>): AddExpr = + if (tail.isEmpty()) { + val newOp: Expr = bind(head) + val newOps = getAddOps(newOp) + val type = newOp.type + type.Add(newOps) + } else { + val newHead = Utils.head(tail) + val newTail = Utils.tail(tail) + val unifiedOps: Pair, Expr> = unify(head, newHead) + val newLeftOp = unifiedOps.first + val newRightOp = unifiedOps.second + val type = newLeftOp.type + val newLeftOps = getAddOps(newLeftOp) + val newOps = newLeftOps + newRightOp + val newAddExpr = type.Add(newOps) + combineAdd(newAddExpr, newTail) } - private fun > combineAdd(head: Expr<*>, tail: List>): AddExpr = - if (tail.isEmpty()) { - val newOp: Expr = bind(head) - val newOps = getAddOps(newOp) - val type = newOp.type - type.Add(newOps) - } else { - val newHead = Utils.head(tail) - val newTail = Utils.tail(tail) - val unifiedOps: Pair, Expr> = unify(head, newHead) - val newLeftOp = unifiedOps.first - val newRightOp = unifiedOps.second - val type = newLeftOp.type - val newLeftOps = getAddOps(newLeftOp) - val newOps = newLeftOps + newRightOp - val newAddExpr = type.Add(newOps) - combineAdd(newAddExpr, newTail) - } - - private fun > getAddOps(expr: Expr): List> = - if (expr is AddExpr<*>) (expr as AddExpr).ops else listOf(expr) - - @JvmStatic - fun > Sub(leftOp: Expr<*>, rightOp: Expr<*>): SubExpr<*> = - create(leftOp, rightOp) { type: T, l, r -> - type.Sub(l, r) - } - - @JvmStatic - fun > Pos(op: Expr<*>): PosExpr<*> { - val tOp: Expr = bind(op) - return tOp.type.Pos(tOp) + private fun > getAddOps(expr: Expr): List> = + if (expr is AddExpr<*>) (expr as AddExpr).ops else listOf(expr) + + @JvmStatic + fun > Sub(leftOp: Expr<*>, rightOp: Expr<*>): SubExpr<*> = + create(leftOp, rightOp) { type: T, l, r -> type.Sub(l, r) } + + @JvmStatic + fun > Pos(op: Expr<*>): PosExpr<*> { + val tOp: Expr = bind(op) + return tOp.type.Pos(tOp) + } + + @JvmStatic + fun > Neg(op: Expr<*>): NegExpr<*> { + val tOp: Expr = bind(op) + return tOp.type.Neg(tOp) + } + + // Multiplicative + @JvmStatic + fun > Mul(ops: Iterable>): MulExpr<*> { + val opList = ops.toList() + require(opList.isNotEmpty()) + val head = Utils.head(opList) + val tail = Utils.tail(opList) + return combineMul(head, tail) + } + + private fun > combineMul(head: Expr<*>, tail: List>): MulExpr = + if (tail.isEmpty()) { + val newOp: Expr = bind(head) + val newOps = getMulOps(newOp) + val type = newOp.type + type.Mul(newOps) + } else { + val newHead = Utils.head(tail) + val newTail = Utils.tail(tail) + val unifiedOps: Pair, Expr> = unify(head, newHead) + val newLeftOp = unifiedOps.first + val newRightOp = unifiedOps.second + val type = newLeftOp.type + val newLeftOps = getMulOps(newLeftOp) + val newOps = newLeftOps + newRightOp + val newMulExpr = type.Mul(newOps) + combineMul(newMulExpr, newTail) } - @JvmStatic - fun > Neg(op: Expr<*>): NegExpr<*> { - val tOp: Expr = bind(op) - return tOp.type.Neg(tOp) + private fun > getMulOps(expr: Expr): List> = + if (expr is MulExpr<*>) (expr as MulExpr).ops else listOf(expr) + + @JvmStatic + fun > Div(leftOp: Expr<*>, rightOp: Expr<*>): DivExpr<*> = + create(leftOp, rightOp) { type: T, l, r -> type.Div(l, r) } + + // Divisible + @JvmStatic + fun > Mod(leftOp: Expr<*>, rightOp: Expr<*>): ModExpr<*> = + create(leftOp, rightOp) { type: T, l, r -> type.Mod(l, r) } + + @JvmStatic + fun > Rem(leftOp: Expr<*>, rightOp: Expr<*>): RemExpr<*> = + create(leftOp, rightOp) { type: T, l, r -> type.Rem(l, r) } + + @JvmStatic + // Equational + fun > Eq(leftOp: Expr<*>, rightOp: Expr<*>): EqExpr<*> = + create(leftOp, rightOp) { type: T, l, r -> type.Eq(l, r) } + + @JvmStatic + fun > Neq(leftOp: Expr<*>, rightOp: Expr<*>): NeqExpr<*> = + create(leftOp, rightOp) { type: T, l, r -> type.Neq(l, r) } + + @JvmStatic + // Ordered + fun > Lt(leftOp: Expr<*>, rightOp: Expr<*>): LtExpr<*> = + create(leftOp, rightOp) { type: T, l, r -> type.Lt(l, r) } + + @JvmStatic + fun > Leq(leftOp: Expr<*>, rightOp: Expr<*>): LeqExpr<*> = + create(leftOp, rightOp) { type: T, l, r -> type.Leq(l, r) } + + @JvmStatic + fun > Gt(leftOp: Expr<*>, rightOp: Expr<*>): GtExpr<*> = + create(leftOp, rightOp) { type: T, l, r -> type.Gt(l, r) } + + @JvmStatic + fun > Geq(leftOp: Expr<*>, rightOp: Expr<*>): GeqExpr<*> = + create(leftOp, rightOp) { type: T, l, r -> type.Geq(l, r) } + + // Convenience methods + @JvmStatic + fun > Add(leftOp: Expr<*>, rightOp: Expr<*>): AddExpr<*> = + Add(listOf(leftOp, rightOp)) + + @JvmStatic + fun > Mul(leftOp: Expr<*>, rightOp: Expr<*>): MulExpr<*> = + Mul(listOf(leftOp, rightOp)) + + // Helper methods + + private fun > create( + leftOp: Expr<*>, + rightOp: Expr<*>, + create: (T, Expr, Expr) -> R, + ): R { + val newOps: Pair, Expr> = unify(leftOp, rightOp) + val newLeftOp = newOps.first + val newRightOp = newOps.second + val type = newLeftOp.type + return create(type, newLeftOp, newRightOp) + } + + private fun > unify( + expr1: Expr, + expr2: Expr, + ): Pair, Expr> { + val type1 = expr1.type + val type2 = expr2.type + if (type1 == type2) { + @Suppress("UNCHECKED_CAST") return bind(expr1, expr2 as Expr) } - - // Multiplicative - @JvmStatic - fun > Mul(ops: Iterable>): MulExpr<*> { - val opList = ops.toList() - require(opList.isNotEmpty()) - val head = Utils.head(opList) - val tail = Utils.tail(opList) - return combineMul(head, tail) - } - - private fun > combineMul(head: Expr<*>, tail: List>): MulExpr = - if (tail.isEmpty()) { - val newOp: Expr = bind(head) - val newOps = getMulOps(newOp) - val type = newOp.type - type.Mul(newOps) - } else { - val newHead = Utils.head(tail) - val newTail = Utils.tail(tail) - val unifiedOps: Pair, Expr> = unify(head, newHead) - val newLeftOp = unifiedOps.first - val newRightOp = unifiedOps.second - val type = newLeftOp.type - val newLeftOps = getMulOps(newLeftOp) - val newOps = newLeftOps + newRightOp - val newMulExpr = type.Mul(newOps) - combineMul(newMulExpr, newTail) - } - - private fun > getMulOps(expr: Expr): List> = - if (expr is MulExpr<*>) (expr as MulExpr).ops else listOf(expr) - - @JvmStatic - fun > Div(leftOp: Expr<*>, rightOp: Expr<*>): DivExpr<*> = - create(leftOp, rightOp) { type: T, l, r -> - type.Div(l, r) - } - - // Divisible - @JvmStatic - fun > Mod(leftOp: Expr<*>, rightOp: Expr<*>): ModExpr<*> = - create(leftOp, rightOp) { type: T, l, r -> - type.Mod(l, r) - } - - @JvmStatic - fun > Rem(leftOp: Expr<*>, rightOp: Expr<*>): RemExpr<*> = - create(leftOp, rightOp) { type: T, l, r -> - type.Rem(l, r) - } - - @JvmStatic - // Equational - fun > Eq(leftOp: Expr<*>, rightOp: Expr<*>): EqExpr<*> = - create(leftOp, rightOp) { type: T, l, r -> - type.Eq(l, r) - } - - @JvmStatic - fun > Neq(leftOp: Expr<*>, rightOp: Expr<*>): NeqExpr<*> = - create(leftOp, rightOp) { type: T, l, r -> - type.Neq(l, r) - } - - @JvmStatic - // Ordered - fun > Lt(leftOp: Expr<*>, rightOp: Expr<*>): LtExpr<*> = - create(leftOp, rightOp) { type: T, l, r -> - type.Lt(l, r) - } - - @JvmStatic - fun > Leq(leftOp: Expr<*>, rightOp: Expr<*>): LeqExpr<*> = - create(leftOp, rightOp) { type: T, l, r -> - type.Leq(l, r) - } - - @JvmStatic - fun > Gt(leftOp: Expr<*>, rightOp: Expr<*>): GtExpr<*> = - create(leftOp, rightOp) { type: T, l, r -> - type.Gt(l, r) - } - - @JvmStatic - fun > Geq(leftOp: Expr<*>, rightOp: Expr<*>): GeqExpr<*> = - create(leftOp, rightOp) { type: T, l, r -> - type.Geq(l, r) - } - - // Convenience methods - @JvmStatic - fun > Add(leftOp: Expr<*>, rightOp: Expr<*>): AddExpr<*> = - Add(listOf(leftOp, rightOp)) - - @JvmStatic - fun > Mul(leftOp: Expr<*>, rightOp: Expr<*>): MulExpr<*> = - Mul(listOf(leftOp, rightOp)) - - // Helper methods - - private fun > create( - leftOp: Expr<*>, rightOp: Expr<*>, create: (T, Expr, Expr) -> R - ): R { - val newOps: Pair, Expr> = unify(leftOp, rightOp) - val newLeftOp = newOps.first - val newRightOp = newOps.second - val type = newLeftOp.type - return create(type, newLeftOp, newRightOp) + if (type1 is Castable<*>) { + @Suppress("UNCHECKED_CAST") val cType1 = type1 as C + + @Suppress("UNCHECKED_CAST") val cExpr1 = expr1 as Expr + val tryToCast = Try.attempt { cType1.Cast(cExpr1, type2) } + if (tryToCast.isSuccess) { + val t2Expr1 = tryToCast.asSuccess().value + return bind(t2Expr1, expr2) + } } - - private fun > unify( - expr1: Expr, expr2: Expr - ): Pair, Expr> { - val type1 = expr1.type - val type2 = expr2.type - if (type1 == type2) { - @Suppress("UNCHECKED_CAST") - return bind(expr1, expr2 as Expr) - } - if (type1 is Castable<*>) { - @Suppress("UNCHECKED_CAST") - val cType1 = type1 as C - - @Suppress("UNCHECKED_CAST") - val cExpr1 = expr1 as Expr - val tryToCast = Try.attempt { cType1.Cast(cExpr1, type2) } - if (tryToCast.isSuccess) { - val t2Expr1 = tryToCast.asSuccess().value - return bind(t2Expr1, expr2) - } - } - if (type2 is Castable<*>) { - @Suppress("UNCHECKED_CAST") - val cType2 = type2 as C - - @Suppress("UNCHECKED_CAST") - val cExpr2 = expr2 as Expr - val tryToCast = Try.attempt { cType2.Cast(cExpr2, type1) } - if (tryToCast.isSuccess) { - val t1Expr2 = tryToCast.asSuccess().value - return bind(expr1, t1Expr2) - } - } - throw ClassCastException("Types $type1 and $type2 can not be unified") + if (type2 is Castable<*>) { + @Suppress("UNCHECKED_CAST") val cType2 = type2 as C + + @Suppress("UNCHECKED_CAST") val cExpr2 = expr2 as Expr + val tryToCast = Try.attempt { cType2.Cast(cExpr2, type1) } + if (tryToCast.isSuccess) { + val t1Expr2 = tryToCast.asSuccess().value + return bind(expr1, t1Expr2) + } } + throw ClassCastException("Types $type1 and $type2 can not be unified") + } - @Suppress("UNCHECKED_CAST") - private fun bind(expr: Expr): Expr = expr as Expr + @Suppress("UNCHECKED_CAST") + private fun bind(expr: Expr): Expr = expr as Expr - @Suppress("UNCHECKED_CAST") - private fun bind(expr1: Expr, expr2: Expr): Pair, Expr> = - Pair(expr1 as Expr, expr2 as Expr) + @Suppress("UNCHECKED_CAST") + private fun bind( + expr1: Expr, + expr2: Expr, + ): Pair, Expr> = Pair(expr1 as Expr, expr2 as Expr) } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/AddExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/AddExpr.kt index de9b08cdec..7eae8be1e6 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/AddExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/AddExpr.kt @@ -20,20 +20,17 @@ import hu.bme.mit.theta.core.type.MultiaryExpr import hu.bme.mit.theta.core.utils.TypeUtils.cast import kotlinx.serialization.Serializable -/** - * Abstract class for additive expressions with multiple operands. - */ +/** Abstract class for additive expressions with multiple operands. */ @Serializable abstract class AddExpr> : MultiaryExpr() { - companion object { + companion object { - @JvmStatic - fun > create2(ops: List>): AddExpr<*> { - require(ops.isNotEmpty()) - @Suppress("UNCHECKED_CAST") - val type = ops[0].type as ExprType - return type.Add(ops.map { cast(it, type) }) - } + @JvmStatic + fun > create2(ops: List>): AddExpr<*> { + require(ops.isNotEmpty()) + @Suppress("UNCHECKED_CAST") val type = ops[0].type as ExprType + return type.Add(ops.map { cast(it, type) }) } + } } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Additive.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Additive.kt index f509e8ab12..c42877a8b2 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Additive.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Additive.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.abstracttype import hu.bme.mit.theta.core.type.Expr @@ -23,8 +22,11 @@ import kotlinx.serialization.Polymorphic @Polymorphic interface Additive> : Type { - fun Add(ops: Iterable>): AddExpr - fun Sub(leftOp: Expr, rightOp: Expr): SubExpr - fun Pos(op: Expr): PosExpr - fun Neg(op: Expr): NegExpr + fun Add(ops: Iterable>): AddExpr + + fun Sub(leftOp: Expr, rightOp: Expr): SubExpr + + fun Pos(op: Expr): PosExpr + + fun Neg(op: Expr): NegExpr } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/CastExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/CastExpr.kt index b91526d6e4..cf8c00c411 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/CastExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/CastExpr.kt @@ -19,10 +19,7 @@ import hu.bme.mit.theta.core.type.Type import hu.bme.mit.theta.core.type.UnaryExpr import kotlinx.serialization.Serializable -/** - * Abstract class for cast expressions with a single operand. - */ +/** Abstract class for cast expressions with a single operand. */ @Serializable -abstract class CastExpr, TargetType : Type> : UnaryExpr() - - +abstract class CastExpr, TargetType : Type> : + UnaryExpr() diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Castable.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Castable.kt index 3b5a6bdef2..99cba51bc7 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Castable.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Castable.kt @@ -27,5 +27,5 @@ import kotlinx.serialization.Polymorphic @Polymorphic interface Castable> : Type { - fun Cast(op: Expr, type: TargetType): Expr + fun Cast(op: Expr, type: TargetType): Expr } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/DivExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/DivExpr.kt index 7199996ac2..1f75a4ba21 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/DivExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/DivExpr.kt @@ -1,3 +1,18 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package hu.bme.mit.theta.core.type.abstracttype import hu.bme.mit.theta.core.type.BinaryExpr @@ -12,18 +27,17 @@ import kotlinx.serialization.Serializable @Serializable abstract class DivExpr> : BinaryExpr() { - companion object { + companion object { - @JvmStatic - fun > create2( - leftOp: Expr<*>, - rightOp: Expr<*> - ): DivExpr<*> { - @Suppress("UNCHECKED_CAST") - val type = leftOp.type as ExprType - val newLeftOp = cast(leftOp, type) - val newRightOp = cast(rightOp, type) - return type.Div(newLeftOp, newRightOp) - } + @JvmStatic + fun > create2( + leftOp: Expr<*>, + rightOp: Expr<*>, + ): DivExpr<*> { + @Suppress("UNCHECKED_CAST") val type = leftOp.type as ExprType + val newLeftOp = cast(leftOp, type) + val newRightOp = cast(rightOp, type) + return type.Div(newLeftOp, newRightOp) } + } } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Divisible.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Divisible.kt index 913fc1fecf..b3a144b847 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Divisible.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Divisible.kt @@ -1,3 +1,18 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package hu.bme.mit.theta.core.type.abstracttype import hu.bme.mit.theta.core.type.Expr @@ -12,7 +27,7 @@ import kotlinx.serialization.Polymorphic @Polymorphic interface Divisible> : Type { - fun Mod(leftOp: Expr, rightOp: Expr): ModExpr - fun Rem(leftOp: Expr, rightOp: Expr): RemExpr -} + fun Mod(leftOp: Expr, rightOp: Expr): ModExpr + fun Rem(leftOp: Expr, rightOp: Expr): RemExpr +} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/EqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/EqExpr.kt index 7c8d62c545..993cdd496a 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/EqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/EqExpr.kt @@ -1,3 +1,18 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package hu.bme.mit.theta.core.type.abstracttype import hu.bme.mit.theta.core.type.BinaryExpr @@ -10,24 +25,21 @@ import kotlinx.serialization.Serializable @Serializable abstract class EqExpr> : BinaryExpr() { - companion object { + companion object { - private const val OPERATOR_LABEL = "=" + private const val OPERATOR_LABEL = "=" - @JvmStatic - fun > create2( - leftOp: Expr<*>, - rightOp: Expr<*> - ): EqExpr<*> { - @Suppress("UNCHECKED_CAST") - val type = leftOp.type as OpType - val newLeftOp = cast(leftOp, type) - val newRightOp = cast(rightOp, type) - return type.Eq(newLeftOp, newRightOp) - } + @JvmStatic + fun > create2(leftOp: Expr<*>, rightOp: Expr<*>): EqExpr<*> { + @Suppress("UNCHECKED_CAST") val type = leftOp.type as OpType + val newLeftOp = cast(leftOp, type) + val newRightOp = cast(rightOp, type) + return type.Eq(newLeftOp, newRightOp) } + } - override val type: BoolType = Bool() + override val type: BoolType = Bool() - override val operatorLabel: String get() = OPERATOR_LABEL + override val operatorLabel: String + get() = OPERATOR_LABEL } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Equational.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Equational.kt index f573638742..3780768a82 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Equational.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Equational.kt @@ -1,3 +1,18 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package hu.bme.mit.theta.core.type.abstracttype import hu.bme.mit.theta.core.type.Expr @@ -12,6 +27,7 @@ import kotlinx.serialization.Polymorphic @Polymorphic interface Equational> : Type { - fun Eq(leftOp: Expr, rightOp: Expr): EqExpr - fun Neq(leftOp: Expr, rightOp: Expr): NeqExpr + fun Eq(leftOp: Expr, rightOp: Expr): EqExpr + + fun Neq(leftOp: Expr, rightOp: Expr): NeqExpr } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/GeqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/GeqExpr.kt index 0001cfc361..d851d9d068 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/GeqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/GeqExpr.kt @@ -1,3 +1,18 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package hu.bme.mit.theta.core.type.abstracttype import hu.bme.mit.theta.core.type.BinaryExpr @@ -7,29 +22,24 @@ import hu.bme.mit.theta.core.type.booltype.BoolType import hu.bme.mit.theta.core.utils.TypeUtils.cast import kotlinx.serialization.Serializable -/** - * Abstract base class for greater-or-equal expressions over ordered types. - */ +/** Abstract base class for greater-or-equal expressions over ordered types. */ @Serializable abstract class GeqExpr> : BinaryExpr() { - companion object { - private const val OPERATOR_LABEL = ">=" + companion object { + private const val OPERATOR_LABEL = ">=" - @JvmStatic - fun > create2( - leftOp: Expr<*>, - rightOp: Expr<*> - ): GeqExpr<*> { - @Suppress("UNCHECKED_CAST") - val type = leftOp.type as OpType - val newLeftOp = cast(leftOp, type) - val newRightOp = cast(rightOp, type) - return type.Geq(newLeftOp, newRightOp) - } + @JvmStatic + fun > create2(leftOp: Expr<*>, rightOp: Expr<*>): GeqExpr<*> { + @Suppress("UNCHECKED_CAST") val type = leftOp.type as OpType + val newLeftOp = cast(leftOp, type) + val newRightOp = cast(rightOp, type) + return type.Geq(newLeftOp, newRightOp) } + } - override val type: BoolType = Bool() + override val type: BoolType = Bool() - override val operatorLabel: String get() = OPERATOR_LABEL + override val operatorLabel: String + get() = OPERATOR_LABEL } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/GtExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/GtExpr.kt index b459ba55d9..51f6354f5d 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/GtExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/GtExpr.kt @@ -1,3 +1,18 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package hu.bme.mit.theta.core.type.abstracttype import hu.bme.mit.theta.core.type.BinaryExpr @@ -8,29 +23,26 @@ import hu.bme.mit.theta.core.utils.TypeUtils.cast import kotlinx.serialization.Serializable /** - * Abstract base class for greater-than (>) expressions over ordered types. - * Used to represent > operations in the expression tree. + * Abstract base class for greater-than (>) expressions over ordered types. Used to represent > + * operations in the expression tree. */ @Serializable abstract class GtExpr> : BinaryExpr() { - companion object { - private const val OPERATOR_LABEL = ">" + companion object { + private const val OPERATOR_LABEL = ">" - @JvmStatic - fun > create2( - leftOp: Expr<*>, - rightOp: Expr<*> - ): GtExpr<*> { - @Suppress("UNCHECKED_CAST") - val type = leftOp.type as OpType - val newLeftOp = cast(leftOp, type) - val newRightOp = cast(rightOp, type) - return type.Gt(newLeftOp, newRightOp) - } + @JvmStatic + fun > create2(leftOp: Expr<*>, rightOp: Expr<*>): GtExpr<*> { + @Suppress("UNCHECKED_CAST") val type = leftOp.type as OpType + val newLeftOp = cast(leftOp, type) + val newRightOp = cast(rightOp, type) + return type.Gt(newLeftOp, newRightOp) } + } - override val type: BoolType = Bool() + override val type: BoolType = Bool() - override val operatorLabel: String get() = OPERATOR_LABEL + override val operatorLabel: String + get() = OPERATOR_LABEL } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/LeqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/LeqExpr.kt index 741bceac0b..f4eeed7350 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/LeqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/LeqExpr.kt @@ -1,3 +1,18 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package hu.bme.mit.theta.core.type.abstracttype import hu.bme.mit.theta.core.type.BinaryExpr @@ -7,28 +22,24 @@ import hu.bme.mit.theta.core.type.booltype.BoolType import hu.bme.mit.theta.core.utils.TypeUtils.cast import kotlinx.serialization.Serializable -/** - * Abstract base class for less-or-equal (≤) expressions over ordered types. - */ +/** Abstract base class for less-or-equal (≤) expressions over ordered types. */ @Serializable abstract class LeqExpr> : BinaryExpr() { - companion object { - private const val OPERATOR_LABEL = "<=" - @JvmStatic - fun > create2( - leftOp: Expr<*>, - rightOp: Expr<*> - ): LeqExpr<*> { - @Suppress("UNCHECKED_CAST") - val type = leftOp.type as OpType - val newLeftOp = cast(leftOp, type) - val newRightOp = cast(rightOp, type) - return type.Leq(newLeftOp, newRightOp) - } + companion object { + private const val OPERATOR_LABEL = "<=" + + @JvmStatic + fun > create2(leftOp: Expr<*>, rightOp: Expr<*>): LeqExpr<*> { + @Suppress("UNCHECKED_CAST") val type = leftOp.type as OpType + val newLeftOp = cast(leftOp, type) + val newRightOp = cast(rightOp, type) + return type.Leq(newLeftOp, newRightOp) } + } - override val type: BoolType = Bool() + override val type: BoolType = Bool() - override val operatorLabel: String get() = OPERATOR_LABEL + override val operatorLabel: String + get() = OPERATOR_LABEL } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/LtExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/LtExpr.kt index 77f80b4d65..ecb46c981a 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/LtExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/LtExpr.kt @@ -1,3 +1,18 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package hu.bme.mit.theta.core.type.abstracttype import hu.bme.mit.theta.core.type.BinaryExpr @@ -7,29 +22,24 @@ import hu.bme.mit.theta.core.type.booltype.BoolType import hu.bme.mit.theta.core.utils.TypeUtils.cast import kotlinx.serialization.Serializable -/** - * Abstract base class for less-than (<) expressions over ordered types. - */ +/** Abstract base class for less-than (<) expressions over ordered types. */ @Serializable abstract class LtExpr> : BinaryExpr() { - companion object { - private const val OPERATOR_LABEL = "<" + companion object { + private const val OPERATOR_LABEL = "<" - @JvmStatic - fun > create2( - leftOp: Expr<*>, - rightOp: Expr<*> - ): LtExpr<*> { - @Suppress("UNCHECKED_CAST") - val type = leftOp.type as OpType - val newLeftOp = cast(leftOp, type) - val newRightOp = cast(rightOp, type) - return type.Lt(newLeftOp, newRightOp) - } + @JvmStatic + fun > create2(leftOp: Expr<*>, rightOp: Expr<*>): LtExpr<*> { + @Suppress("UNCHECKED_CAST") val type = leftOp.type as OpType + val newLeftOp = cast(leftOp, type) + val newRightOp = cast(rightOp, type) + return type.Lt(newLeftOp, newRightOp) } + } - override val operatorLabel: String get() = OPERATOR_LABEL + override val operatorLabel: String + get() = OPERATOR_LABEL - override val type: BoolType = Bool() + override val type: BoolType = Bool() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/ModExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/ModExpr.kt index f070ffcdd6..0962f9a59d 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/ModExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/ModExpr.kt @@ -1,3 +1,18 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package hu.bme.mit.theta.core.type.abstracttype import hu.bme.mit.theta.core.type.BinaryExpr @@ -5,23 +20,17 @@ import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.utils.TypeUtils.cast import kotlinx.serialization.Serializable -/** - * Abstract base class for modulo (mod) expressions over divisible types. - */ +/** Abstract base class for modulo (mod) expressions over divisible types. */ @Serializable abstract class ModExpr> : BinaryExpr() { - companion object { - @JvmStatic - fun > create2( - leftOp: Expr<*>, - rightOp: Expr<*> - ): ModExpr<*> { - @Suppress("UNCHECKED_CAST") - val type = leftOp.type as ExprType - val newLeftOp = cast(leftOp, type) - val newRightOp = cast(rightOp, type) - return type.Mod(newLeftOp, newRightOp) - } + companion object { + @JvmStatic + fun > create2(leftOp: Expr<*>, rightOp: Expr<*>): ModExpr<*> { + @Suppress("UNCHECKED_CAST") val type = leftOp.type as ExprType + val newLeftOp = cast(leftOp, type) + val newRightOp = cast(rightOp, type) + return type.Mod(newLeftOp, newRightOp) } + } } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/MulExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/MulExpr.kt index 736c3bf2d8..bae8f2f755 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/MulExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/MulExpr.kt @@ -1,3 +1,18 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package hu.bme.mit.theta.core.type.abstracttype import hu.bme.mit.theta.core.type.Expr @@ -5,21 +20,16 @@ import hu.bme.mit.theta.core.type.MultiaryExpr import hu.bme.mit.theta.core.utils.TypeUtils.cast import kotlinx.serialization.Serializable -/** - * Abstract base class for multiplication expressions over types that support multiplication. - */ +/** Abstract base class for multiplication expressions over types that support multiplication. */ @Serializable abstract class MulExpr> : MultiaryExpr() { - companion object { - @JvmStatic - fun > create2( - ops: List> - ): MulExpr<*> { - require(ops.isNotEmpty()) - @Suppress("UNCHECKED_CAST") - val type = ops[0].type as ExprType - return type.Mul(ops.map { cast(it, type) }) - } + companion object { + @JvmStatic + fun > create2(ops: List>): MulExpr<*> { + require(ops.isNotEmpty()) + @Suppress("UNCHECKED_CAST") val type = ops[0].type as ExprType + return type.Mul(ops.map { cast(it, type) }) } + } } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Multiplicative.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Multiplicative.kt index 21ebb5d9b0..56bea7eaac 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Multiplicative.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Multiplicative.kt @@ -1,15 +1,28 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package hu.bme.mit.theta.core.type.abstracttype import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.Type import kotlinx.serialization.Polymorphic -/** - * Represents a type that supports multiplication and division operations. - */ +/** Represents a type that supports multiplication and division operations. */ @Polymorphic interface Multiplicative> : Type { - fun Mul(ops: Iterable>): MulExpr - fun Div(leftOp: Expr, rightOp: Expr): DivExpr -} + fun Mul(ops: Iterable>): MulExpr + fun Div(leftOp: Expr, rightOp: Expr): DivExpr +} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/NegExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/NegExpr.kt index 72d4d5f5dd..1eb23766a1 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/NegExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/NegExpr.kt @@ -1,3 +1,18 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package hu.bme.mit.theta.core.type.abstracttype import hu.bme.mit.theta.core.type.Expr @@ -5,21 +20,16 @@ import hu.bme.mit.theta.core.type.UnaryExpr import hu.bme.mit.theta.core.utils.TypeUtils.cast import kotlinx.serialization.Serializable -/** - * Abstract base class for negation expressions over additive types. - */ +/** Abstract base class for negation expressions over additive types. */ @Serializable abstract class NegExpr> : UnaryExpr() { - companion object { - @JvmStatic - fun > create2( - op: Expr<*> - ): NegExpr<*> { - @Suppress("UNCHECKED_CAST") - val type = op.type as ExprType - val newOp = cast(op, type) - return type.Neg(newOp) - } + companion object { + @JvmStatic + fun > create2(op: Expr<*>): NegExpr<*> { + @Suppress("UNCHECKED_CAST") val type = op.type as ExprType + val newOp = cast(op, type) + return type.Neg(newOp) } + } } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/NeqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/NeqExpr.kt index 5225963835..5398c4b92c 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/NeqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/NeqExpr.kt @@ -1,3 +1,18 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package hu.bme.mit.theta.core.type.abstracttype import hu.bme.mit.theta.core.type.BinaryExpr @@ -7,29 +22,24 @@ import hu.bme.mit.theta.core.type.booltype.BoolType import hu.bme.mit.theta.core.utils.TypeUtils.cast import kotlinx.serialization.Serializable -/** - * Abstract base class for not-equal (!=) expressions over equational types. - */ +/** Abstract base class for not-equal (!=) expressions over equational types. */ @Serializable abstract class NeqExpr> : BinaryExpr() { - companion object { - private const val OPERATOR_LABEL = "/=" + companion object { + private const val OPERATOR_LABEL = "/=" - @JvmStatic - fun > create2( - leftOp: Expr<*>, - rightOp: Expr<*> - ): NeqExpr<*> { - @Suppress("UNCHECKED_CAST") - val type = leftOp.type as OpType - val newLeftOp = cast(leftOp, type) - val newRightOp = cast(rightOp, type) - return type.Neq(newLeftOp, newRightOp) - } + @JvmStatic + fun > create2(leftOp: Expr<*>, rightOp: Expr<*>): NeqExpr<*> { + @Suppress("UNCHECKED_CAST") val type = leftOp.type as OpType + val newLeftOp = cast(leftOp, type) + val newRightOp = cast(rightOp, type) + return type.Neq(newLeftOp, newRightOp) } + } - override val operatorLabel: String get() = OPERATOR_LABEL + override val operatorLabel: String + get() = OPERATOR_LABEL - override val type: BoolType = Bool() + override val type: BoolType = Bool() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Ordered.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Ordered.kt index d6ba175cf8..21a38fdc2b 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Ordered.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Ordered.kt @@ -1,17 +1,32 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package hu.bme.mit.theta.core.type.abstracttype import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.Type import kotlinx.serialization.Polymorphic -/** - * Represents a type that supports ordering and comparison operations. - */ +/** Represents a type that supports ordering and comparison operations. */ @Polymorphic interface Ordered> : Type { - fun Lt(leftOp: Expr, rightOp: Expr): LtExpr - fun Leq(leftOp: Expr, rightOp: Expr): LeqExpr - fun Gt(leftOp: Expr, rightOp: Expr): GtExpr - fun Geq(leftOp: Expr, rightOp: Expr): GeqExpr -} + fun Lt(leftOp: Expr, rightOp: Expr): LtExpr + fun Leq(leftOp: Expr, rightOp: Expr): LeqExpr + + fun Gt(leftOp: Expr, rightOp: Expr): GtExpr + + fun Geq(leftOp: Expr, rightOp: Expr): GeqExpr +} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/PosExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/PosExpr.kt index 533fd99c56..b3dafaf9ce 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/PosExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/PosExpr.kt @@ -1,3 +1,18 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package hu.bme.mit.theta.core.type.abstracttype import hu.bme.mit.theta.core.type.Expr @@ -5,21 +20,16 @@ import hu.bme.mit.theta.core.type.UnaryExpr import hu.bme.mit.theta.core.utils.TypeUtils.cast import kotlinx.serialization.Serializable -/** - * Abstract base class for positive (unary plus) expressions over additive types. - */ +/** Abstract base class for positive (unary plus) expressions over additive types. */ @Serializable abstract class PosExpr> : UnaryExpr() { - companion object { - @JvmStatic - fun > create2( - op: Expr<*> - ): PosExpr<*> { - @Suppress("UNCHECKED_CAST") - val type = op.type as ExprType - val newOp = cast(op, type) - return type.Pos(newOp) - } + companion object { + @JvmStatic + fun > create2(op: Expr<*>): PosExpr<*> { + @Suppress("UNCHECKED_CAST") val type = op.type as ExprType + val newOp = cast(op, type) + return type.Pos(newOp) } + } } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/RemExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/RemExpr.kt index a3e5da6c44..d090cd7821 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/RemExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/RemExpr.kt @@ -1,3 +1,18 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package hu.bme.mit.theta.core.type.abstracttype import hu.bme.mit.theta.core.type.BinaryExpr @@ -5,23 +20,17 @@ import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.utils.TypeUtils.cast import kotlinx.serialization.Serializable -/** - * Abstract base class for remainder expressions over divisible types. - */ +/** Abstract base class for remainder expressions over divisible types. */ @Serializable abstract class RemExpr> : BinaryExpr() { - companion object { - @JvmStatic - fun > create2( - leftOp: Expr<*>, - rightOp: Expr<*> - ): RemExpr<*> { - @Suppress("UNCHECKED_CAST") - val type = leftOp.type as ExprType - val newLeftOp = cast(leftOp, type) - val newRightOp = cast(rightOp, type) - return type.Rem(newLeftOp, newRightOp) - } + companion object { + @JvmStatic + fun > create2(leftOp: Expr<*>, rightOp: Expr<*>): RemExpr<*> { + @Suppress("UNCHECKED_CAST") val type = leftOp.type as ExprType + val newLeftOp = cast(leftOp, type) + val newRightOp = cast(rightOp, type) + return type.Rem(newLeftOp, newRightOp) } + } } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/SubExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/SubExpr.kt index b3288d6f5e..f27c206073 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/SubExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/SubExpr.kt @@ -1,3 +1,18 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package hu.bme.mit.theta.core.type.abstracttype import hu.bme.mit.theta.core.type.BinaryExpr @@ -5,23 +20,17 @@ import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.utils.TypeUtils.cast import kotlinx.serialization.Serializable -/** - * Abstract base class for subtraction expressions over additive types. - */ +/** Abstract base class for subtraction expressions over additive types. */ @Serializable abstract class SubExpr> : BinaryExpr() { - companion object { - @JvmStatic - fun > create2( - leftOp: Expr<*>, - rightOp: Expr<*> - ): SubExpr<*> { - @Suppress("UNCHECKED_CAST") - val type = leftOp.type as ExprType - val newLeftOp = cast(leftOp, type) - val newRightOp = cast(rightOp, type) - return type.Sub(newLeftOp, newRightOp) - } + companion object { + @JvmStatic + fun > create2(leftOp: Expr<*>, rightOp: Expr<*>): SubExpr<*> { + @Suppress("UNCHECKED_CAST") val type = leftOp.type as ExprType + val newLeftOp = cast(leftOp, type) + val newRightOp = cast(rightOp, type) + return type.Sub(newLeftOp, newRightOp) } + } } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/Dereference.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/Dereference.kt index 5040ad204e..97d698baa4 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/Dereference.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/Dereference.kt @@ -38,57 +38,51 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("Dereference") data class Dereference( - val array: Expr, - val offset: Expr, - override val type: T, - val uniquenessIdx: Expr? = null + val array: Expr, + val offset: Expr, + override val type: T, + val uniquenessIdx: Expr? = null, ) : Expr { - companion object { + companion object { - private const val OPERATOR_LABEL = "deref" + private const val OPERATOR_LABEL = "deref" - @JvmStatic - fun of( - array: Expr, - offset: Expr, - type: T - ): Dereference = Dereference(array, offset, type) + @JvmStatic + fun of( + array: Expr, + offset: Expr, + type: T, + ): Dereference = Dereference(array, offset, type) - @JvmStatic - private fun of( - array: Expr, - offset: Expr, - uniqueness: Expr, - type: T - ): Dereference = Dereference(array, offset, type, uniqueness) - } + @JvmStatic + private fun of( + array: Expr, + offset: Expr, + uniqueness: Expr, + type: T, + ): Dereference = Dereference(array, offset, type, uniqueness) + } - fun withUniquenessExpr(expr: Expr): Dereference = - of(array, offset, expr, type) + fun withUniquenessExpr(expr: Expr): Dereference = of(array, offset, expr, type) - override val arity: Int = 3 + override val arity: Int = 3 - override val ops: List> = - if (uniquenessIdx != null) listOf(array, offset, uniquenessIdx) - else listOf(array, offset) + override val ops: List> = + if (uniquenessIdx != null) listOf(array, offset, uniquenessIdx) else listOf(array, offset) - override fun eval(`val` : Valuation): LitExpr = - throw IllegalStateException("Reference/Dereference expressions are not meant to be evaluated!") + override fun eval(`val`: Valuation): LitExpr = + throw IllegalStateException("Reference/Dereference expressions are not meant to be evaluated!") - @Suppress("UNCHECKED_CAST") - override fun withOps(ops: List>): Expr { - require(ops.size == 2 || ops.size == 3) { "Dereference must have 2 or 3 operands" } - return when (ops.size) { - 2 -> of(ops[0] as Expr, ops[1] as Expr, type) - else -> of(ops[0] as Expr, ops[1] as Expr, ops[2] as Expr, type) - } + @Suppress("UNCHECKED_CAST") + override fun withOps(ops: List>): Expr { + require(ops.size == 2 || ops.size == 3) { "Dereference must have 2 or 3 operands" } + return when (ops.size) { + 2 -> of(ops[0] as Expr, ops[1] as Expr, type) + else -> of(ops[0] as Expr, ops[1] as Expr, ops[2] as Expr, type) } + } - override fun toString(): String = - Utils.lispStringBuilder(OPERATOR_LABEL) - .body() - .addAll(ops) - .add(type) - .toString() + override fun toString(): String = + Utils.lispStringBuilder(OPERATOR_LABEL).body().addAll(ops).add(type).toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/Exprs.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/Exprs.kt index 2ab64cce9b..862be7300b 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/Exprs.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/Exprs.kt @@ -20,50 +20,41 @@ import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.Type import hu.bme.mit.theta.core.type.booltype.BoolType -/** - * Factory and utility methods for any-type expressions. - */ +/** Factory and utility methods for any-type expressions. */ @Suppress("FunctionName") object Exprs { - @JvmStatic - fun Ref(decl: Decl): RefExpr = - RefExpr(decl) + @JvmStatic fun Ref(decl: Decl): RefExpr = RefExpr(decl) - @JvmStatic - fun Ite( - cond: Expr, - then: Expr, - elze: Expr - ): IteExpr = - IteExpr(cond, then, elze) + @JvmStatic + fun Ite( + cond: Expr, + then: Expr, + elze: Expr, + ): IteExpr = IteExpr(cond, then, elze) - @JvmStatic - fun Prime(op: Expr): PrimeExpr = - PrimeExpr(op) + @JvmStatic fun Prime(op: Expr): PrimeExpr = PrimeExpr(op) - @JvmStatic - fun Dereference( - arr: Expr, - offset: Expr, - type: ExprType - ): Dereference = - Dereference.of(arr, offset, type) + @JvmStatic + fun Dereference( + arr: Expr, + offset: Expr, + type: ExprType, + ): Dereference = Dereference.of(arr, offset, type) - @JvmStatic - fun Reference( - expr: Expr, - type: ArrType - ): Reference = - Reference.of(expr, type) + @JvmStatic + fun Reference( + expr: Expr, + type: ArrType, + ): Reference = Reference.of(expr, type) - // Convenience methods - @JvmStatic - fun Prime(op: Expr, i: Int): Expr { - require(i >= 0) - return when (i) { - 0 -> op - 1 -> Prime(op) - else -> Prime(Prime(op, i - 1)) - } + // Convenience methods + @JvmStatic + fun Prime(op: Expr, i: Int): Expr { + require(i >= 0) + return when (i) { + 0 -> op + 1 -> Prime(op) + else -> Prime(Prime(op, i - 1)) } + } } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/InvalidLitExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/InvalidLitExpr.kt index bf90d9f3d2..94aa7f5141 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/InvalidLitExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/InvalidLitExpr.kt @@ -29,13 +29,12 @@ import kotlinx.serialization.Serializable */ @Serializable @SerialName("InvalidLit") -data class InvalidLitExpr( - override val type: ExprType -) : NullaryExpr(), LitExpr { +data class InvalidLitExpr(override val type: ExprType) : + NullaryExpr(), LitExpr { - override fun eval(`val`: Valuation): LitExpr = this + override fun eval(`val`: Valuation): LitExpr = this - override val isInvalid: Boolean = true + override val isInvalid: Boolean = true - override fun equals(other: Any?): Boolean = false + override fun equals(other: Any?): Boolean = false } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/IteExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/IteExpr.kt index d381e09df9..bbc8e1e950 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/IteExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/IteExpr.kt @@ -35,76 +35,68 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("Ite") data class IteExpr( - val cond: Expr, - val then: Expr, - val elze: Expr + val cond: Expr, + val then: Expr, + val elze: Expr, ) : Expr { - companion object { - - private const val OPERATOR_LABEL = "ite" - - @JvmStatic - fun of( - cond: Expr, - then: Expr, - elze: Expr - ): IteExpr = IteExpr(cond, then, elze) - - @JvmStatic - fun create( - cond: Expr<*>, - then: Expr<*>, - elze: Expr<*> - ): IteExpr { - val newCond = cast(cond, Bool()) - - @Suppress("UNCHECKED_CAST") - val newThen = then as Expr - val newElze = cast(elze, newThen.type) - return of(newCond, newThen, newElze) - } - } + companion object { + + private const val OPERATOR_LABEL = "ite" + + @JvmStatic + fun of( + cond: Expr, + then: Expr, + elze: Expr, + ): IteExpr = IteExpr(cond, then, elze) - override val type: ExprType = then.type + @JvmStatic + fun create(cond: Expr<*>, then: Expr<*>, elze: Expr<*>): IteExpr { + val newCond = cast(cond, Bool()) - override val arity: Int = 3 + @Suppress("UNCHECKED_CAST") val newThen = then as Expr + val newElze = cast(elze, newThen.type) + return of(newCond, newThen, newElze) + } + } + + override val type: ExprType = then.type - override val ops: List> = listOf(cond, then, elze) + override val arity: Int = 3 - fun getElse(): Expr = elze + override val ops: List> = listOf(cond, then, elze) - override fun eval(`val`: Valuation): LitExpr = - if ((cond.eval(`val`) as BoolLitExpr).value) { - then.eval(`val`) - } else { - elze.eval(`val`) - } + fun getElse(): Expr = elze - override fun withOps(ops: List>): IteExpr { - require(ops.size == 3) { "Operands must have size 3 for Ite expression" } - val newCond = cast(ops[0], Bool()) - val newThen = cast(ops[1], type) - val newElze = cast(ops[2], type) - return with(newCond, newThen, newElze) + override fun eval(`val`: Valuation): LitExpr = + if ((cond.eval(`val`) as BoolLitExpr).value) { + then.eval(`val`) + } else { + elze.eval(`val`) } - fun with(cond: Expr, then: Expr, elze: Expr): IteExpr = - if (this.cond === cond && this.then === then && this.elze === elze) { - this - } else { - of(cond, then, elze) - } + override fun withOps(ops: List>): IteExpr { + require(ops.size == 3) { "Operands must have size 3 for Ite expression" } + val newCond = cast(ops[0], Bool()) + val newThen = cast(ops[1], type) + val newElze = cast(ops[2], type) + return with(newCond, newThen, newElze) + } + + fun with(cond: Expr, then: Expr, elze: Expr): IteExpr = + if (this.cond === cond && this.then === then && this.elze === elze) { + this + } else { + of(cond, then, elze) + } - fun withCond(cond: Expr): IteExpr = with(cond, then, elze) + fun withCond(cond: Expr): IteExpr = with(cond, then, elze) - fun withThen(then: Expr): IteExpr = with(cond, then, elze) + fun withThen(then: Expr): IteExpr = with(cond, then, elze) - fun withElse(elze: Expr): IteExpr = with(cond, then, elze) + fun withElse(elze: Expr): IteExpr = with(cond, then, elze) - override fun toString(): String = Utils.lispStringBuilder(OPERATOR_LABEL) - .add(cond) - .add(then) - .add(elze) - .toString() + override fun toString(): String = + Utils.lispStringBuilder(OPERATOR_LABEL).add(cond).add(then).add(elze).toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/PrimeExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/PrimeExpr.kt index f82bea0d53..7d196ef9f7 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/PrimeExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/PrimeExpr.kt @@ -30,24 +30,23 @@ import kotlinx.serialization.Serializable */ @Serializable @SerialName("Prime") -data class PrimeExpr( - override val op: Expr -) : UnaryExpr() { +data class PrimeExpr(override val op: Expr) : + UnaryExpr() { - companion object { + companion object { - private const val OPERATOR_LABEL = "prime" - @JvmStatic - fun of(op: Expr): PrimeExpr = PrimeExpr(op) - } + private const val OPERATOR_LABEL = "prime" - override val type: ExprType = op.type + @JvmStatic fun of(op: Expr): PrimeExpr = PrimeExpr(op) + } - override fun eval(`val`: Valuation): LitExpr { - throw UnsupportedOperationException("Prime expressions cannot be evaluated") - } + override val type: ExprType = op.type - override fun new(op: Expr): PrimeExpr = of(op) + override fun eval(`val`: Valuation): LitExpr { + throw UnsupportedOperationException("Prime expressions cannot be evaluated") + } - override val operatorLabel: String = OPERATOR_LABEL + override fun new(op: Expr): PrimeExpr = of(op) + + override val operatorLabel: String = OPERATOR_LABEL } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/RefExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/RefExpr.kt index 1d5c8cbb5c..93e6b6645d 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/RefExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/RefExpr.kt @@ -30,22 +30,19 @@ import kotlinx.serialization.Serializable */ @Serializable @SerialName("Ref") -data class RefExpr( - val decl: Decl -) : NullaryExpr() { +data class RefExpr(val decl: Decl) : NullaryExpr() { - companion object { + companion object { - @JvmStatic - fun of(decl: Decl): RefExpr = RefExpr(decl) - } + @JvmStatic fun of(decl: Decl): RefExpr = RefExpr(decl) + } - override val type: DeclType = decl.type + override val type: DeclType = decl.type - override fun eval(`val`: Valuation): LitExpr = - `val`.eval(decl).orElseThrow { - IllegalStateException("No value found for declaration: ${decl.name}") - } + override fun eval(`val`: Valuation): LitExpr = + `val`.eval(decl).orElseThrow { + IllegalStateException("No value found for declaration: ${decl.name}") + } - override fun toString(): String = decl.name + override fun toString(): String = decl.name } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/Reference.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/Reference.kt index 66eae08bff..ae1c1abef3 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/Reference.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/Reference.kt @@ -34,33 +34,30 @@ import kotlinx.serialization.Serializable */ @Serializable @SerialName("Reference") -data class Reference( - val expr: Expr, - override val type: A -) : Expr { +data class Reference(val expr: Expr, override val type: A) : Expr { - companion object { - private const val OPERATOR_LABEL = "ref" - @JvmStatic - fun of(expr: Expr, type: A): Reference = Reference(expr, type) - } + companion object { + private const val OPERATOR_LABEL = "ref" + + @JvmStatic + fun of(expr: Expr, type: A): Reference = Reference(expr, type) + } - override val arity: Int = 1 + override val arity: Int = 1 - override val ops: List> = listOf(expr) + override val ops: List> = listOf(expr) - override fun eval(`val`: Valuation): LitExpr = - throw IllegalStateException("Reference/Dereference expressions are not meant to be evaluated!") + override fun eval(`val`: Valuation): LitExpr = + throw IllegalStateException("Reference/Dereference expressions are not meant to be evaluated!") - override fun withOps(ops: List>): Expr { - require(ops.size == 1) { "Reference must have exactly one operand" } - require(ops[0] is RefExpr<*> && (ops[0] as RefExpr<*>).decl is VarDecl<*>) { - "Don't transform references to constants." - } - @Suppress("UNCHECKED_CAST") - return Reference(ops[0] as Expr, type) + override fun withOps(ops: List>): Expr { + require(ops.size == 1) { "Reference must have exactly one operand" } + require(ops[0] is RefExpr<*> && (ops[0] as RefExpr<*>).decl is VarDecl<*>) { + "Don't transform references to constants." } + @Suppress("UNCHECKED_CAST") return Reference(ops[0] as Expr, type) + } - override fun toString(): String = - Utils.lispStringBuilder(OPERATOR_LABEL).body().add(expr).add(type).toString() + override fun toString(): String = + Utils.lispStringBuilder(OPERATOR_LABEL).body().add(expr).add(type).toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayEqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayEqExpr.kt index fe4b355903..203d5f8657 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayEqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayEqExpr.kt @@ -1,3 +1,18 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package hu.bme.mit.theta.core.type.arraytype import hu.bme.mit.theta.core.model.Valuation @@ -10,43 +25,40 @@ import hu.bme.mit.theta.core.utils.TypeUtils.cast import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -/** - * Equality expression for array types. - */ +/** Equality expression for array types. */ @Serializable @SerialName("ArrayEqExpr") data class ArrayEqExpr( - override val leftOp: Expr>, - override val rightOp: Expr> + override val leftOp: Expr>, + override val rightOp: Expr>, ) : EqExpr>() { - companion object { - - @JvmStatic - fun of( - leftOp: Expr>, - rightOp: Expr> - ) = ArrayEqExpr(leftOp, rightOp) - - @JvmStatic - fun create( - leftOp: Expr<*>, rightOp: Expr<*> - ): ArrayEqExpr<*, *> { - @Suppress("UNCHECKED_CAST") - val arrayType = leftOp.type as ArrayType - val newLeftOp = cast(leftOp, arrayType) - val newRightOp = cast(rightOp, arrayType) - return of(newLeftOp, newRightOp) - } + companion object { + + @JvmStatic + fun of( + leftOp: Expr>, + rightOp: Expr>, + ) = ArrayEqExpr(leftOp, rightOp) + + @JvmStatic + fun create( + leftOp: Expr<*>, + rightOp: Expr<*>, + ): ArrayEqExpr<*, *> { + @Suppress("UNCHECKED_CAST") val arrayType = leftOp.type as ArrayType + val newLeftOp = cast(leftOp, arrayType) + val newRightOp = cast(rightOp, arrayType) + return of(newLeftOp, newRightOp) } + } - override fun eval(`val`: Valuation): LitExpr = throw UnsupportedOperationException() + override fun eval(`val`: Valuation): LitExpr = throw UnsupportedOperationException() - override fun new( - leftOp: Expr>, - rightOp: Expr> - ): ArrayEqExpr = - of(leftOp, rightOp) + override fun new( + leftOp: Expr>, + rightOp: Expr>, + ): ArrayEqExpr = of(leftOp, rightOp) - override fun toString(): String = super.toString() + override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayExprs.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayExprs.kt index bd643e46a3..495911d555 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayExprs.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayExprs.kt @@ -1,64 +1,68 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package hu.bme.mit.theta.core.type.arraytype -import hu.bme.mit.theta.common.Tuple2 import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.Type -import kotlinx.serialization.Serializable -/** - * Factory and utility methods for array-type expressions. - */ +/** Factory and utility methods for array-type expressions. */ @Suppress("FunctionName") object ArrayExprs { - @JvmStatic - fun Array( - indexType: IndexType, - elemType: ElemType - ): ArrayType = - ArrayType(indexType, elemType) + @JvmStatic + fun Array( + indexType: IndexType, + elemType: ElemType, + ): ArrayType = ArrayType(indexType, elemType) - @JvmStatic - fun Array( - elements: List, Expr>>, - elseElem: Expr, - type: ArrayType - ): ArrayLitExpr = - ArrayLitExpr.of(elements, elseElem, type) + @JvmStatic + fun Array( + elements: List, Expr>>, + elseElem: Expr, + type: ArrayType, + ): ArrayLitExpr = ArrayLitExpr.of(elements, elseElem, type) - @JvmStatic - fun ArrayInit( - elements: List, Expr>>, - elseElem: Expr, - type: ArrayType - ): ArrayInitExpr = - ArrayInitExpr(elements, elseElem, type) + @JvmStatic + fun ArrayInit( + elements: List, Expr>>, + elseElem: Expr, + type: ArrayType, + ): ArrayInitExpr = ArrayInitExpr(elements, elseElem, type) - @JvmStatic - fun Read( - array: Expr>, - index: Expr - ): ArrayReadExpr = - ArrayReadExpr(array, index) + @JvmStatic + fun Read( + array: Expr>, + index: Expr, + ): ArrayReadExpr = ArrayReadExpr(array, index) - @JvmStatic - fun Write( - array: Expr>, - index: Expr, - elem: Expr - ): ArrayWriteExpr = - ArrayWriteExpr(array, index, elem) + @JvmStatic + fun Write( + array: Expr>, + index: Expr, + elem: Expr, + ): ArrayWriteExpr = ArrayWriteExpr(array, index, elem) - @JvmStatic - fun Eq( - leftOp: Expr>, - rightOp: Expr> - ): ArrayEqExpr = - ArrayEqExpr(leftOp, rightOp) + @JvmStatic + fun Eq( + leftOp: Expr>, + rightOp: Expr>, + ): ArrayEqExpr = ArrayEqExpr(leftOp, rightOp) - @JvmStatic - fun Neq( - leftOp: Expr>, - rightOp: Expr> - ): ArrayNeqExpr = - ArrayNeqExpr(leftOp, rightOp) + @JvmStatic + fun Neq( + leftOp: Expr>, + rightOp: Expr>, + ): ArrayNeqExpr = ArrayNeqExpr(leftOp, rightOp) } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayInitExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayInitExpr.kt index f3cc77feb2..62ead64fb7 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayInitExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayInitExpr.kt @@ -1,3 +1,18 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package hu.bme.mit.theta.core.type.arraytype import hu.bme.mit.theta.core.model.Valuation @@ -19,77 +34,75 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("ArrayInit") data class ArrayInitExpr( - val elements: List, Expr>>, - val elseElem: Expr, - override val type: ArrayType + val elements: List, Expr>>, + val elseElem: Expr, + override val type: ArrayType, ) : MultiaryExpr>() { - @Suppress("UNCHECKED_CAST") - override val ops: List> = - listOf(elseElem as Expr) + - elements.map { it.first as Expr } + - elements.map { it.second as Expr } + @Suppress("UNCHECKED_CAST") + override val ops: List> = + listOf(elseElem as Expr) + + elements.map { it.first as Expr } + + elements.map { it.second as Expr } - companion object { + companion object { - private const val OPERATOR_LABEL = "arrayinit" + private const val OPERATOR_LABEL = "arrayinit" - @JvmStatic - fun of( - elems: List, Expr>>, - elseElem: Expr, - type: ArrayType - ) = ArrayInitExpr(elems, elseElem, type) + @JvmStatic + fun of( + elems: List, Expr>>, + elseElem: Expr, + type: ArrayType, + ) = ArrayInitExpr(elems, elseElem, type) - @JvmStatic - @Suppress("UNCHECKED_CAST") - fun create( - elems: List, Expr>>, - elseElem: Expr<*>, - type: ArrayType<*, *> - ): ArrayInitExpr = - of( - elems.map { Pair(it.first as Expr, it.second as Expr) }, - elseElem as Expr, - type as ArrayType - ) - } + @JvmStatic + @Suppress("UNCHECKED_CAST") + fun create( + elems: List, Expr>>, + elseElem: Expr<*>, + type: ArrayType<*, *>, + ): ArrayInitExpr = + of( + elems.map { Pair(it.first as Expr, it.second as Expr) }, + elseElem as Expr, + type as ArrayType, + ) + } - override fun eval(`val`: Valuation): LitExpr> = - ArrayLitExpr.of( - elements.map { Pair(it.first.eval(`val`), it.second.eval(`val`)) }, - elseElem, - type - ) + override fun eval(`val`: Valuation): LitExpr> = + ArrayLitExpr.of( + elements.map { Pair(it.first.eval(`val`), it.second.eval(`val`)) }, + elseElem, + type, + ) - @Suppress("UNCHECKED_CAST") - override fun with(ops: Iterable>): MultiaryExpr> { - val size = ops.count() - require(size % 2 == 1) { "Ops must be odd long!" } - val elseElem: Expr = ops.first() as Expr - val indices = mutableListOf>() - val elems = mutableListOf>() - ops.forEachIndexed { counter, op -> - when { - counter == 0 -> {} - counter <= (size - 1) / 2 -> indices.add(op as Expr) - else -> elems.add(op as Expr) - } - } - val newOps = indices.indices.map { i -> - indices[i] to elems[i] - } - return of(newOps, elseElem, type) + @Suppress("UNCHECKED_CAST") + override fun with(ops: Iterable>): MultiaryExpr> { + val size = ops.count() + require(size % 2 == 1) { "Ops must be odd long!" } + val elseElem: Expr = ops.first() as Expr + val indices = mutableListOf>() + val elems = mutableListOf>() + ops.forEachIndexed { counter, op -> + when { + counter == 0 -> {} + counter <= (size - 1) / 2 -> indices.add(op as Expr) + else -> elems.add(op as Expr) + } } + val newOps = indices.indices.map { i -> indices[i] to elems[i] } + return of(newOps, elseElem, type) + } - override fun new(ops: List>): MultiaryExpr> = with(ops) + override fun new(ops: List>): MultiaryExpr> = + with(ops) - @Suppress("UNCHECKED_CAST") - override fun withOps(ops: List>): MultiaryExpr> = - with(ops.map { it as Expr }) + @Suppress("UNCHECKED_CAST") + override fun withOps(ops: List>): MultiaryExpr> = + with(ops.map { it as Expr }) - override val operatorLabel: String = OPERATOR_LABEL + override val operatorLabel: String = OPERATOR_LABEL - override fun toString(): String = - "arrayinit($elements, $elseElem, $type)" + override fun toString(): String = "arrayinit($elements, $elseElem, $type)" } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayLitExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayLitExpr.kt index 108b0a07c5..257fc5ba5f 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayLitExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayLitExpr.kt @@ -1,3 +1,18 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package hu.bme.mit.theta.core.type.arraytype import hu.bme.mit.theta.common.Utils @@ -11,47 +26,48 @@ import hu.bme.mit.theta.core.utils.ExprSimplifier import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -/** - * Literal array expression for array types, containing only literal values. - */ +/** Literal array expression for array types, containing only literal values. */ @Serializable @SerialName("ArrayLitExpr") -data class ArrayLitExpr private constructor( - val elements: List, LitExpr>>, - val elseElem: LitExpr, - override val type: ArrayType +data class ArrayLitExpr( + val elements: List, LitExpr>>, + val elseElem: LitExpr, + override val type: ArrayType, ) : NullaryExpr>(), LitExpr> { - companion object { + companion object { - private const val OPERATOR_LABEL = "array" + private const val OPERATOR_LABEL = "array" - @JvmStatic - fun of( - elems: List, Expr>>, - elseElem: Expr, - type: ArrayType - ): ArrayLitExpr { - val simplifier = ExprSimplifier.create() - val simplifiedElse = simplifier.simplify(elseElem, ImmutableValuation.empty()) - require(simplifiedElse is LitExpr<*>) { "ArrayLitExprs shall only contain literal values!" } - val litElse = simplifiedElse as LitExpr - val litElems = elems.map { - val idx = simplifier.simplify(it.first, ImmutableValuation.empty()) - val elem = simplifier.simplify(it.second, ImmutableValuation.empty()) - require(idx is LitExpr<*> && elem is LitExpr<*>) { "ArrayLitExprs shall only contain literal values!" } - Pair(idx as LitExpr, elem as LitExpr) - } - return ArrayLitExpr(litElems, litElse, type) + @JvmStatic + fun of( + elems: List, Expr>>, + elseElem: Expr, + type: ArrayType, + ): ArrayLitExpr { + val simplifier = ExprSimplifier.create() + val simplifiedElse = simplifier.simplify(elseElem, ImmutableValuation.empty()) + require(simplifiedElse is LitExpr<*>) { "ArrayLitExprs shall only contain literal values!" } + val litElse = simplifiedElse as LitExpr + val litElems = + elems.map { + val idx = simplifier.simplify(it.first, ImmutableValuation.empty()) + val elem = simplifier.simplify(it.second, ImmutableValuation.empty()) + require(idx is LitExpr<*> && elem is LitExpr<*>) { + "ArrayLitExprs shall only contain literal values!" + } + Pair(idx as LitExpr, elem as LitExpr) } + return ArrayLitExpr(litElems, litElse, type) } + } - override fun eval(`val`: Valuation): LitExpr> = this + override fun eval(`val`: Valuation): LitExpr> = this - override fun toString(): String = - Utils.lispStringBuilder(OPERATOR_LABEL) - .body() - .addAll(elements.map { "(${it.first} ${it.second})" }) - .add("(default $elseElem)") - .toString() + override fun toString(): String = + Utils.lispStringBuilder(OPERATOR_LABEL) + .body() + .addAll(elements.map { "(${it.first} ${it.second})" }) + .add("(default $elseElem)") + .toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayNeqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayNeqExpr.kt index 4ce8328338..31d15e9601 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayNeqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayNeqExpr.kt @@ -1,3 +1,18 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package hu.bme.mit.theta.core.type.arraytype import hu.bme.mit.theta.core.model.Valuation @@ -10,41 +25,39 @@ import hu.bme.mit.theta.core.utils.TypeUtils.cast import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -/** - * Not-equal expression for array types. - */ +/** Not-equal expression for array types. */ @Serializable @SerialName("ArrayNeqExpr") data class ArrayNeqExpr( - override val leftOp: Expr>, - override val rightOp: Expr> + override val leftOp: Expr>, + override val rightOp: Expr>, ) : NeqExpr>() { - companion object { - @JvmStatic - fun of( - leftOp: Expr>, - rightOp: Expr> - ) = ArrayNeqExpr(leftOp, rightOp) - @JvmStatic - fun create( - leftOp: Expr<*>, rightOp: Expr<*> - ): ArrayNeqExpr<*, *> { - @Suppress("UNCHECKED_CAST") - val arrayType = leftOp.type as ArrayType - val newLeftOp = cast(leftOp, arrayType) - val newRightOp = cast(rightOp, arrayType) - return of(newLeftOp, newRightOp) - } + companion object { + @JvmStatic + fun of( + leftOp: Expr>, + rightOp: Expr>, + ) = ArrayNeqExpr(leftOp, rightOp) + + @JvmStatic + fun create( + leftOp: Expr<*>, + rightOp: Expr<*>, + ): ArrayNeqExpr<*, *> { + @Suppress("UNCHECKED_CAST") val arrayType = leftOp.type as ArrayType + val newLeftOp = cast(leftOp, arrayType) + val newRightOp = cast(rightOp, arrayType) + return of(newLeftOp, newRightOp) } + } - override fun eval(`val`: Valuation): LitExpr = throw UnsupportedOperationException() + override fun eval(`val`: Valuation): LitExpr = throw UnsupportedOperationException() - override fun new( - leftOp: Expr>, - rightOp: Expr> - ): ArrayNeqExpr = - of(leftOp, rightOp) + override fun new( + leftOp: Expr>, + rightOp: Expr>, + ): ArrayNeqExpr = of(leftOp, rightOp) - override fun toString(): String = super.toString() + override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayReadExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayReadExpr.kt index 77b7d05c60..bbd784799b 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayReadExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayReadExpr.kt @@ -1,3 +1,18 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package hu.bme.mit.theta.core.type.arraytype import hu.bme.mit.theta.common.Utils @@ -9,75 +24,71 @@ import hu.bme.mit.theta.core.utils.TypeUtils.cast import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -/** - * Read expression for array types. - */ +/** Read expression for array types. */ @Serializable @SerialName("ArrayReadExpr") data class ArrayReadExpr( - val array: Expr>, - val index: Expr + val array: Expr>, + val index: Expr, ) : Expr { - companion object { + companion object { - private const val OPERATOR_LABEL = "read" + private const val OPERATOR_LABEL = "read" - @JvmStatic - fun of( - array: Expr>, - index: Expr - ) = ArrayReadExpr(array, index) + @JvmStatic + fun of( + array: Expr>, + index: Expr, + ) = ArrayReadExpr(array, index) - @JvmStatic - @Suppress("UNCHECKED_CAST") - fun create( - array: Expr<*>, - index: Expr<*> - ): ArrayReadExpr { - val arrayType = array.type as ArrayType - val newArray = cast(array, arrayType) - val newIndex = cast(index, arrayType.indexType) - return of(newArray, newIndex) - } + @JvmStatic + @Suppress("UNCHECKED_CAST") + fun create( + array: Expr<*>, + index: Expr<*>, + ): ArrayReadExpr { + val arrayType = array.type as ArrayType + val newArray = cast(array, arrayType) + val newIndex = cast(index, arrayType.indexType) + return of(newArray, newIndex) } + } - override val ops: List> - get() = listOf(array, index) + override val ops: List> + get() = listOf(array, index) - override val type: ElemType = array.type.elemType + override val type: ElemType = array.type.elemType - override fun eval(`val`: Valuation): LitExpr { - val arrayVal = array.eval(`val`) as ArrayLitExpr - val indexVal = index.eval(`val`) - arrayVal.elements.forEach { elem -> - if (elem.first == indexVal) return elem.second - } - return arrayVal.elseElem - } + override fun eval(`val`: Valuation): LitExpr { + val arrayVal = array.eval(`val`) as ArrayLitExpr + val indexVal = index.eval(`val`) + arrayVal.elements.forEach { elem -> if (elem.first == indexVal) return elem.second } + return arrayVal.elseElem + } - override fun withOps(ops: List>): Expr { - require(ops.size == 2) - val newArray = cast(ops[0], array.type) - val newIndex = cast(ops[1], index.type) - return with(newArray, newIndex) - } + override fun withOps(ops: List>): Expr { + require(ops.size == 2) + val newArray = cast(ops[0], array.type) + val newIndex = cast(ops[1], index.type) + return with(newArray, newIndex) + } - fun with( - array: Expr>, index: Expr - ): ArrayReadExpr = - if (this.array === array && this.index === index) { - this - } else { - of(array, index) - } + fun with( + array: Expr>, + index: Expr, + ): ArrayReadExpr = + if (this.array === array && this.index === index) { + this + } else { + of(array, index) + } - fun withArray( - array: Expr> - ): ArrayReadExpr = with(array, index) + fun withArray(array: Expr>): ArrayReadExpr = + with(array, index) - fun withIndex(index: Expr): ArrayReadExpr = with(array, index) + fun withIndex(index: Expr): ArrayReadExpr = with(array, index) - override fun toString(): String = - Utils.lispStringBuilder(OPERATOR_LABEL).body().add(array).add(index).toString() + override fun toString(): String = + Utils.lispStringBuilder(OPERATOR_LABEL).body().add(array).add(index).toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayType.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayType.kt index 7b6c3a69aa..ccc009702a 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayType.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayType.kt @@ -1,3 +1,18 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package hu.bme.mit.theta.core.type.arraytype import hu.bme.mit.theta.common.Utils @@ -10,39 +25,38 @@ import hu.bme.mit.theta.core.type.abstracttype.NeqExpr import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -/** - * Represents an array type with a given index and element type. - */ +/** Represents an array type with a given index and element type. */ @Serializable @SerialName(ArrayType.TYPE_LABEL) data class ArrayType( - val indexType: IndexType, - val elemType: ElemType + val indexType: IndexType, + val elemType: ElemType, ) : Equational> { - companion object { + companion object { + + internal const val TYPE_LABEL = "Array" - internal const val TYPE_LABEL = "Array" - @JvmStatic - fun of( - indexType: IndexType, elemType: ElemType - ): ArrayType = - ArrayType(indexType, elemType) - } + @JvmStatic + fun of( + indexType: IndexType, + elemType: ElemType, + ): ArrayType = ArrayType(indexType, elemType) + } - override fun Eq( - leftOp: Expr>, - rightOp: Expr> - ): EqExpr> = ArrayExprs.Eq(leftOp, rightOp) + override fun Eq( + leftOp: Expr>, + rightOp: Expr>, + ): EqExpr> = ArrayExprs.Eq(leftOp, rightOp) - override fun Neq( - leftOp: Expr>, - rightOp: Expr> - ): NeqExpr> = ArrayExprs.Neq(leftOp, rightOp) + override fun Neq( + leftOp: Expr>, + rightOp: Expr>, + ): NeqExpr> = ArrayExprs.Neq(leftOp, rightOp) - override fun toString(): String = - Utils.lispStringBuilder(TYPE_LABEL).add("([${indexType}] -> $elemType)").toString() + override fun toString(): String = + Utils.lispStringBuilder(TYPE_LABEL).add("([${indexType}] -> $elemType)").toString() - override val domainSize: DomainSize - get() = DomainSize.pow(elemType.domainSize, indexType.domainSize) + override val domainSize: DomainSize + get() = DomainSize.pow(elemType.domainSize, indexType.domainSize) } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayWriteExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayWriteExpr.kt index f237726b68..b0d0bae61d 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayWriteExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayWriteExpr.kt @@ -1,3 +1,18 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package hu.bme.mit.theta.core.type.arraytype import hu.bme.mit.theta.common.Utils @@ -9,77 +24,77 @@ import hu.bme.mit.theta.core.utils.TypeUtils.cast import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -/** - * Write expression for array types. - */ +/** Write expression for array types. */ @Serializable @SerialName("ArrayWriteExpr") data class ArrayWriteExpr( - val array: Expr>, - val index: Expr, - val elem: Expr + val array: Expr>, + val index: Expr, + val elem: Expr, ) : Expr> { - companion object { + companion object { - private const val OPERATOR_LABEL = "write" + private const val OPERATOR_LABEL = "write" - @JvmStatic - fun of( - array: Expr>, - index: Expr, - elem: Expr - ) = ArrayWriteExpr(array, index, elem) + @JvmStatic + fun of( + array: Expr>, + index: Expr, + elem: Expr, + ) = ArrayWriteExpr(array, index, elem) - @JvmStatic - @Suppress("UNCHECKED_CAST") - fun create( - array: Expr<*>, - index: Expr<*>, - elem: Expr<*> - ): ArrayWriteExpr { - val arrayType = array.type as ArrayType - val newArray = cast(array, arrayType) - val newIndex = cast(index, arrayType.indexType) - val newElem = cast(elem, arrayType.elemType) - return of(newArray, newIndex, newElem) - } + @JvmStatic + @Suppress("UNCHECKED_CAST") + fun create( + array: Expr<*>, + index: Expr<*>, + elem: Expr<*>, + ): ArrayWriteExpr { + val arrayType = array.type as ArrayType + val newArray = cast(array, arrayType) + val newIndex = cast(index, arrayType.indexType) + val newElem = cast(elem, arrayType.elemType) + return of(newArray, newIndex, newElem) } + } - override val ops: List> = listOf(array, index, elem) + override val ops: List> = listOf(array, index, elem) - override val type: ArrayType = ArrayType(index.type, elem.type) + override val type: ArrayType = ArrayType(index.type, elem.type) - override fun eval(`val`: Valuation): LitExpr> { - val arrayVal = array.eval(`val`) as ArrayLitExpr - val indexVal = index.eval(`val`) - val elemVal = elem.eval(`val`) - val elemList = arrayVal.elements.filter { it.first != indexVal } + Pair(indexVal, elemVal) - return ArrayLitExpr.of(elemList, arrayVal.elseElem, arrayVal.type) - } + override fun eval(`val`: Valuation): LitExpr> { + val arrayVal = array.eval(`val`) as ArrayLitExpr + val indexVal = index.eval(`val`) + val elemVal = elem.eval(`val`) + val elemList = arrayVal.elements.filter { it.first != indexVal } + Pair(indexVal, elemVal) + return ArrayLitExpr.of(elemList, arrayVal.elseElem, arrayVal.type) + } + + override fun toString(): String = + Utils.lispStringBuilder(OPERATOR_LABEL).body().add(array).add(index).add(elem).toString() - override fun toString(): String = - Utils.lispStringBuilder(OPERATOR_LABEL).body().add(array).add(index).add(elem).toString() + override fun withOps(ops: List>): ArrayWriteExpr { + require(ops.size == 3) + val newArray = cast(ops[0], array.type) + val newIndex = cast(ops[1], index.type) + val newElem = cast(ops[2], elem.type) + return with(newArray, newIndex, newElem) + } - override fun withOps(ops: List>): ArrayWriteExpr { - require(ops.size == 3) - val newArray = cast(ops[0], array.type) - val newIndex = cast(ops[1], index.type) - val newElem = cast(ops[2], elem.type) - return with(newArray, newIndex, newElem) + fun with( + array: Expr>, + index: Expr, + elem: Expr, + ): ArrayWriteExpr = + if (this.array === array && this.index === index && this.elem === elem) { + this + } else { + of(array, index, elem) } - fun with( - array: Expr>, - index: Expr, - elem: Expr - ): ArrayWriteExpr = - if (this.array === array && this.index === index && this.elem === elem) { - this - } else { - of(array, index, elem) - } + fun withIndex(index: Expr): ArrayWriteExpr = + with(array, index, elem) - fun withIndex(index: Expr): ArrayWriteExpr = with(array, index, elem) - fun withElem(elem: Expr): ArrayWriteExpr = with(array, index, elem) + fun withElem(elem: Expr): ArrayWriteExpr = with(array, index, elem) } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/AndExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/AndExpr.kt index adfb848853..fd8b751618 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/AndExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/AndExpr.kt @@ -1,3 +1,18 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package hu.bme.mit.theta.core.type.booltype import hu.bme.mit.theta.common.Utils @@ -11,31 +26,29 @@ import hu.bme.mit.theta.core.utils.TypeUtils.cast import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -/** - * Logical AND expression for boolean type. - */ +/** Logical AND expression for boolean type. */ @Serializable @SerialName("And") -data class AndExpr( - override val ops: List> -) : MultiaryExpr() { +data class AndExpr(override val ops: List>) : MultiaryExpr() { + + companion object { + + private const val OPERATOR_LABEL = "and" + + @JvmStatic fun of(ops: Iterable>) = AndExpr(ops.toList()) + + @JvmStatic fun create(ops: List>) = AndExpr(ops.map { cast(it, Bool()) }) + } - companion object { + override val type: BoolType = Bool() - private const val OPERATOR_LABEL = "and" - @JvmStatic - fun of(ops: Iterable>) = AndExpr(ops.toList()) - @JvmStatic - fun create(ops: List>) = AndExpr(ops.map { cast(it, Bool()) }) - } + override fun eval(`val`: Valuation): BoolLitExpr = + if (ops.any { !(it.eval(`val`) as BoolLitExpr).value }) False() else True() - override val type: BoolType = Bool() - override fun eval(`val`: Valuation): BoolLitExpr = - if (ops.any { !(it.eval(`val`) as BoolLitExpr).value }) False() else True() + override fun new(ops: List>): AndExpr = of(ops) - override fun new(ops: List>): AndExpr = - of(ops) + override fun toString(): String = Utils.lispStringBuilder(OPERATOR_LABEL).add(ops).toString() - override fun toString(): String = Utils.lispStringBuilder(OPERATOR_LABEL).add(ops).toString() - override val operatorLabel: String get() = OPERATOR_LABEL + override val operatorLabel: String + get() = OPERATOR_LABEL } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/BoolExprs.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/BoolExprs.kt index c50d52a000..62884d9788 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/BoolExprs.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/BoolExprs.kt @@ -1,55 +1,55 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package hu.bme.mit.theta.core.type.booltype import hu.bme.mit.theta.core.decl.ParamDecl import hu.bme.mit.theta.core.type.Expr -/** - * Factory and utility methods for boolean expressions. - */ +/** Factory and utility methods for boolean expressions. */ @Suppress("FunctionName") object BoolExprs { - @JvmStatic - fun Bool() = BoolType + @JvmStatic fun Bool() = BoolType - @JvmStatic - fun Bool(value: Boolean) = BoolLitExpr.of(value) + @JvmStatic fun Bool(value: Boolean) = BoolLitExpr.of(value) - @JvmStatic - fun True() = TrueExpr + @JvmStatic fun True() = TrueExpr - @JvmStatic - fun False() = FalseExpr + @JvmStatic fun False() = FalseExpr - @JvmStatic - fun Not(op: Expr) = NotExpr(op) + @JvmStatic fun Not(op: Expr) = NotExpr(op) - @JvmStatic - fun Imply(leftOp: Expr, rightOp: Expr) = ImplyExpr(leftOp, rightOp) + @JvmStatic fun Imply(leftOp: Expr, rightOp: Expr) = ImplyExpr(leftOp, rightOp) - @JvmStatic - fun Iff(leftOp: Expr, rightOp: Expr) = IffExpr(leftOp, rightOp) + @JvmStatic fun Iff(leftOp: Expr, rightOp: Expr) = IffExpr(leftOp, rightOp) - @JvmStatic - fun Xor(leftOp: Expr, rightOp: Expr) = XorExpr(leftOp, rightOp) + @JvmStatic fun Xor(leftOp: Expr, rightOp: Expr) = XorExpr(leftOp, rightOp) - @JvmStatic - fun And(ops: Iterable>) = AndExpr.of(ops) + @JvmStatic fun And(ops: Iterable>) = AndExpr.of(ops) - @JvmStatic - fun Or(ops: Iterable>) = OrExpr.of(ops) + @JvmStatic fun Or(ops: Iterable>) = OrExpr.of(ops) - @JvmStatic - fun Forall(paramDecls: Iterable>, op: Expr) = ForallExpr.of(paramDecls, op) + @JvmStatic + fun Forall(paramDecls: Iterable>, op: Expr) = ForallExpr.of(paramDecls, op) - @JvmStatic - fun Exists(paramDecls: Iterable>, op: Expr) = ExistsExpr.of(paramDecls, op) + @JvmStatic + fun Exists(paramDecls: Iterable>, op: Expr) = ExistsExpr.of(paramDecls, op) - // Convenience methods - @JvmStatic - fun And(vararg ops: Expr) = AndExpr.of(ops.asList()) + // Convenience methods + @JvmStatic fun And(vararg ops: Expr) = AndExpr.of(ops.asList()) - @JvmStatic - fun Or(vararg ops: Expr) = OrExpr.of(ops.asList()) + @JvmStatic fun Or(vararg ops: Expr) = OrExpr.of(ops.asList()) } - diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/BoolLitExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/BoolLitExpr.kt index 5d56773922..49b8de9761 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/BoolLitExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/BoolLitExpr.kt @@ -1,3 +1,18 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package hu.bme.mit.theta.core.type.booltype import hu.bme.mit.theta.core.model.Valuation @@ -7,40 +22,39 @@ import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -/** - * Abstract base class for boolean literal expressions. - */ +/** Abstract base class for boolean literal expressions. */ @Serializable sealed class BoolLitExpr : NullaryExpr(), LitExpr { - abstract val value: Boolean + abstract val value: Boolean - override val type: BoolType = Bool() + override val type: BoolType = Bool() - override fun eval(`val`: Valuation): BoolLitExpr = this + override fun eval(`val`: Valuation): BoolLitExpr = this - companion object { - @JvmStatic - fun of(value: Boolean): BoolLitExpr = if (value) TrueExpr else FalseExpr - } + companion object { + @JvmStatic fun of(value: Boolean): BoolLitExpr = if (value) TrueExpr else FalseExpr + } } @Serializable @SerialName("False") object FalseExpr : BoolLitExpr() { - @JvmStatic - fun getInstance(): FalseExpr = this - override val value: Boolean = false - override fun toString(): String = "false" + @JvmStatic fun getInstance(): FalseExpr = this + + override val value: Boolean = false + + override fun toString(): String = "false" } @Serializable @SerialName("True") object TrueExpr : BoolLitExpr() { - @JvmStatic - fun getInstance(): TrueExpr = this - override val value: Boolean = true - override fun toString(): String = "true" -} \ No newline at end of file + @JvmStatic fun getInstance(): TrueExpr = this + + override val value: Boolean = true + + override fun toString(): String = "true" +} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/BoolType.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/BoolType.kt index a96a4ddba8..348a374f34 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/BoolType.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/BoolType.kt @@ -1,3 +1,18 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package hu.bme.mit.theta.core.type.booltype import hu.bme.mit.theta.core.type.DomainSize @@ -7,26 +22,22 @@ import hu.bme.mit.theta.core.type.abstracttype.NeqExpr import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -/** - * Boolean type for expressions. - */ +/** Boolean type for expressions. */ @Serializable @SerialName(BoolType.TYPE_LABEL) object BoolType : Equational { - internal const val TYPE_LABEL = "Bool" + internal const val TYPE_LABEL = "Bool" - @JvmStatic - fun getInstance(): BoolType = this + @JvmStatic fun getInstance(): BoolType = this - override fun toString(): String = TYPE_LABEL + override fun toString(): String = TYPE_LABEL - override fun Eq(leftOp: Expr, rightOp: Expr): IffExpr = - BoolExprs.Iff(leftOp, rightOp) + override fun Eq(leftOp: Expr, rightOp: Expr): IffExpr = + BoolExprs.Iff(leftOp, rightOp) - override fun Neq(leftOp: Expr, rightOp: Expr): NeqExpr = - BoolExprs.Xor(leftOp, rightOp) + override fun Neq(leftOp: Expr, rightOp: Expr): NeqExpr = + BoolExprs.Xor(leftOp, rightOp) - override val domainSize: DomainSize = DomainSize.TWO + override val domainSize: DomainSize = DomainSize.TWO } - diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/IffExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/IffExpr.kt index 715a647eaf..a4504ec68a 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/IffExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/IffExpr.kt @@ -1,3 +1,18 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package hu.bme.mit.theta.core.type.booltype import hu.bme.mit.theta.core.model.Valuation @@ -8,33 +23,31 @@ import hu.bme.mit.theta.core.utils.TypeUtils.cast import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -/** - * Logical IFF (if and only if) expression for boolean type. - */ +/** Logical IFF (if and only if) expression for boolean type. */ @Serializable @SerialName("Iff") -data class IffExpr( - override val leftOp: Expr, - override val rightOp: Expr -) : EqExpr() { +data class IffExpr(override val leftOp: Expr, override val rightOp: Expr) : + EqExpr() { + + companion object { - companion object { + private const val OPERATOR_LABEL = "iff" - private const val OPERATOR_LABEL = "iff" + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = IffExpr(leftOp, rightOp) - @JvmStatic - fun of(leftOp: Expr, rightOp: Expr) = IffExpr(leftOp, rightOp) + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + IffExpr(cast(leftOp, Bool()), cast(rightOp, Bool())) + } - @JvmStatic - fun create(leftOp: Expr<*>, rightOp: Expr<*>) = IffExpr(cast(leftOp, Bool()), cast(rightOp, Bool())) - } + override val operatorLabel: String + get() = OPERATOR_LABEL - override val operatorLabel: String get() = OPERATOR_LABEL - override fun eval(`val`: Valuation): BoolLitExpr = - Bool((leftOp.eval(`val`) as BoolLitExpr).value == (rightOp.eval(`val`) as BoolLitExpr).value) + override fun eval(`val`: Valuation): BoolLitExpr = + Bool((leftOp.eval(`val`) as BoolLitExpr).value == (rightOp.eval(`val`) as BoolLitExpr).value) - override fun new(leftOp: Expr, rightOp: Expr): IffExpr = - IffExpr(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): IffExpr = + IffExpr(leftOp, rightOp) - override fun toString(): String = super.toString() + override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/ImplyExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/ImplyExpr.kt index ff1fb6fa23..24e24dd32b 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/ImplyExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/ImplyExpr.kt @@ -1,35 +1,55 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package hu.bme.mit.theta.core.type.booltype import hu.bme.mit.theta.common.Utils import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.BinaryExpr import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool -import hu.bme.mit.theta.core.type.BinaryExpr import hu.bme.mit.theta.core.utils.TypeUtils.cast import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -/** - * Logical implication (=>) expression for boolean type. - */ +/** Logical implication (=>) expression for boolean type. */ @Serializable @SerialName("Imply") -data class ImplyExpr( - override val leftOp: Expr, - override val rightOp: Expr -) : BinaryExpr() { - companion object { - private const val OPERATOR_LABEL = "=>" - @JvmStatic - fun of(leftOp: Expr, rightOp: Expr) = ImplyExpr(leftOp, rightOp) - @JvmStatic - fun create(leftOp: Expr<*>, rightOp: Expr<*>) = ImplyExpr(cast(leftOp, Bool()), cast(rightOp, Bool())) - } - override val type: BoolType = Bool() - override fun eval(`val`: Valuation): BoolLitExpr = - Bool(!(leftOp.eval(`val`) as BoolLitExpr).value || (rightOp.eval(`val`) as BoolLitExpr).value) - override fun new(leftOp: Expr, rightOp: Expr): ImplyExpr = - ImplyExpr(leftOp, rightOp) - override fun toString(): String = Utils.lispStringBuilder(OPERATOR_LABEL).add(leftOp).add(rightOp).toString() - override val operatorLabel: String get() = OPERATOR_LABEL +data class ImplyExpr(override val leftOp: Expr, override val rightOp: Expr) : + BinaryExpr() { + companion object { + private const val OPERATOR_LABEL = "=>" + + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = ImplyExpr(leftOp, rightOp) + + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + ImplyExpr(cast(leftOp, Bool()), cast(rightOp, Bool())) + } + + override val type: BoolType = Bool() + + override fun eval(`val`: Valuation): BoolLitExpr = + Bool(!(leftOp.eval(`val`) as BoolLitExpr).value || (rightOp.eval(`val`) as BoolLitExpr).value) + + override fun new(leftOp: Expr, rightOp: Expr): ImplyExpr = + ImplyExpr(leftOp, rightOp) + + override fun toString(): String = + Utils.lispStringBuilder(OPERATOR_LABEL).add(leftOp).add(rightOp).toString() + + override val operatorLabel: String + get() = OPERATOR_LABEL } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/NotExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/NotExpr.kt index 24fdea6619..e841c2d330 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/NotExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/NotExpr.kt @@ -1,3 +1,18 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package hu.bme.mit.theta.core.type.booltype import hu.bme.mit.theta.common.Utils @@ -9,28 +24,27 @@ import hu.bme.mit.theta.core.utils.TypeUtils.cast import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -/** - * Logical NOT expression for boolean type. - */ +/** Logical NOT expression for boolean type. */ @Serializable @SerialName("Not") -data class NotExpr( - override val op: Expr -) : UnaryExpr() { +data class NotExpr(override val op: Expr) : UnaryExpr() { + + companion object { + + private const val OPERATOR_LABEL = "not" + + @JvmStatic fun of(op: Expr) = NotExpr(op) + + @JvmStatic fun create(op: Expr<*>) = NotExpr(cast(op, Bool())) + } + + override val type: BoolType = Bool() - companion object { + override fun eval(`val`: Valuation): BoolLitExpr = Bool(!(op.eval(`val`) as BoolLitExpr).value) - private const val OPERATOR_LABEL = "not" + override fun new(op: Expr): NotExpr = NotExpr(op) - @JvmStatic - fun of(op: Expr) = NotExpr(op) - @JvmStatic - fun create(op: Expr<*>) = NotExpr(cast(op, Bool())) - } + override fun toString(): String = Utils.lispStringBuilder(OPERATOR_LABEL).add(op).toString() - override val type: BoolType = Bool() - override fun eval(`val`: Valuation): BoolLitExpr = Bool(!(op.eval(`val`) as BoolLitExpr).value) - override fun new(op: Expr): NotExpr = NotExpr(op) - override fun toString(): String = Utils.lispStringBuilder(OPERATOR_LABEL).add(op).toString() - override val operatorLabel: String = OPERATOR_LABEL + override val operatorLabel: String = OPERATOR_LABEL } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/OrExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/OrExpr.kt index 0edeb5c6fe..5a2db5c3aa 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/OrExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/OrExpr.kt @@ -1,3 +1,18 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package hu.bme.mit.theta.core.type.booltype import hu.bme.mit.theta.common.Utils @@ -11,33 +26,29 @@ import hu.bme.mit.theta.core.utils.TypeUtils.cast import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -/** - * Logical OR expression for boolean type. - */ +/** Logical OR expression for boolean type. */ @Serializable @SerialName("Or") -data class OrExpr( - override val ops: List> -) : MultiaryExpr() { +data class OrExpr(override val ops: List>) : MultiaryExpr() { + + companion object { + + private const val OPERATOR_LABEL = "or" - companion object { + @JvmStatic fun of(ops: Iterable>) = OrExpr(ops.toList()) - private const val OPERATOR_LABEL = "or" + @JvmStatic fun create(ops: List>) = OrExpr(ops.map { cast(it, Bool()) }) + } - @JvmStatic - fun of(ops: Iterable>) = OrExpr(ops.toList()) + override val type: BoolType = Bool() - @JvmStatic - fun create(ops: List>) = OrExpr(ops.map { cast(it, Bool()) }) - } + override fun eval(`val`: Valuation): BoolLitExpr = + if (ops.any { (it.eval(`val`) as BoolLitExpr).value }) True() else False() - override val type: BoolType = Bool() - override fun eval(`val`: Valuation): BoolLitExpr = - if (ops.any { (it.eval(`val`) as BoolLitExpr).value }) True() else False() + override fun new(ops: List>): OrExpr = of(ops) - override fun new(ops: List>): OrExpr = - of(ops) + override fun toString(): String = Utils.lispStringBuilder(OPERATOR_LABEL).add(ops).toString() - override fun toString(): String = Utils.lispStringBuilder(OPERATOR_LABEL).add(ops).toString() - override val operatorLabel: String get() = OPERATOR_LABEL + override val operatorLabel: String + get() = OPERATOR_LABEL } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/QuantifiedExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/QuantifiedExpr.kt index be6aececfc..0db748899d 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/QuantifiedExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/QuantifiedExpr.kt @@ -1,3 +1,18 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package hu.bme.mit.theta.core.type.booltype import hu.bme.mit.theta.common.Utils @@ -10,85 +25,85 @@ import hu.bme.mit.theta.core.utils.TypeUtils.cast import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -/** - * Abstract base class for quantified boolean expressions (forall, exists). - */ +/** Abstract base class for quantified boolean expressions (forall, exists). */ @Serializable sealed class QuantifiedExpr : Expr { - abstract val paramDecls: List> - abstract val op: Expr + abstract val paramDecls: List> + abstract val op: Expr + + override val type: BoolType = Bool() + override val ops: List> + get() = listOf(op) + + override fun withOps(ops: List>): Expr { + require(ops.size == 1) { "QuantifiedExpr expects exactly one operand." } + return with(cast(ops[0], Bool())) + } - override val type: BoolType = Bool() - override val ops: List> get() = listOf(op) - override fun withOps(ops: List>): Expr { - require(ops.size == 1) { "QuantifiedExpr expects exactly one operand." } - return with(cast(ops[0], Bool())) - } + override fun eval(`val`: Valuation): LitExpr = throw UnsupportedOperationException() - override fun eval(`val`: Valuation): LitExpr = throw UnsupportedOperationException() + override fun toString(): String { + val paramString = + paramDecls.joinToString(" ", prefix = "(", postfix = ")") { "(${it.name} ${it.type})" } + return Utils.lispStringBuilder(operatorLabel).body().add(paramString).add(op).toString() + } - override fun toString(): String { - val paramString = paramDecls.joinToString(" ", prefix = "(", postfix = ")") { "(${it.name} ${it.type})" } - return Utils.lispStringBuilder(operatorLabel).body().add(paramString).add(op).toString() - } + abstract fun with(op: Expr): QuantifiedExpr - abstract fun with(op: Expr): QuantifiedExpr - protected abstract val operatorLabel: String + protected abstract val operatorLabel: String } -/** - * Existential quantifier expression for boolean type. - */ +/** Existential quantifier expression for boolean type. */ @Serializable @SerialName("Exists") data class ExistsExpr( - override val paramDecls: List>, - override val op: Expr + override val paramDecls: List>, + override val op: Expr, ) : QuantifiedExpr() { - companion object { + companion object { + + private const val OPERATOR_LABEL = "exists" - private const val OPERATOR_LABEL = "exists" - @JvmStatic - fun of(paramDecls: Iterable>, op: Expr) = - ExistsExpr(paramDecls.toList(), op) + @JvmStatic + fun of(paramDecls: Iterable>, op: Expr) = + ExistsExpr(paramDecls.toList(), op) - @JvmStatic - fun create(paramDecls: Iterable>, op: Expr<*>) = - ExistsExpr(paramDecls.toList(), cast(op, Bool())) - } + @JvmStatic + fun create(paramDecls: Iterable>, op: Expr<*>) = + ExistsExpr(paramDecls.toList(), cast(op, Bool())) + } - override fun with(op: Expr): ExistsExpr = - if (op == this.op) this else ExistsExpr(paramDecls, op) + override fun with(op: Expr): ExistsExpr = + if (op == this.op) this else ExistsExpr(paramDecls, op) - override val operatorLabel: String = OPERATOR_LABEL + override val operatorLabel: String = OPERATOR_LABEL } -/** - * Universal quantifier expression for boolean type. - */ +/** Universal quantifier expression for boolean type. */ @Serializable @SerialName("Forall") data class ForallExpr( - override val paramDecls: List>, - override val op: Expr + override val paramDecls: List>, + override val op: Expr, ) : QuantifiedExpr() { - companion object { + companion object { + + private const val OPERATOR_LABEL = "forall" - private const val OPERATOR_LABEL = "forall" - @JvmStatic - fun of(paramDecls: Iterable>, op: Expr) = - ForallExpr(paramDecls.toList(), op) + @JvmStatic + fun of(paramDecls: Iterable>, op: Expr) = + ForallExpr(paramDecls.toList(), op) - @JvmStatic - fun create(paramDecls: Iterable>, op: Expr<*>) = - ForallExpr(paramDecls.toList(), cast(op, Bool())) - } + @JvmStatic + fun create(paramDecls: Iterable>, op: Expr<*>) = + ForallExpr(paramDecls.toList(), cast(op, Bool())) + } - override fun with(op: Expr): ForallExpr = - if (op == this.op) this else ForallExpr(paramDecls, op) + override fun with(op: Expr): ForallExpr = + if (op == this.op) this else ForallExpr(paramDecls, op) - override val operatorLabel: String = OPERATOR_LABEL + override val operatorLabel: String = OPERATOR_LABEL } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/SmartBoolExprs.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/SmartBoolExprs.kt index ae6f05f792..3abdee8513 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/SmartBoolExprs.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/SmartBoolExprs.kt @@ -1,59 +1,71 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package hu.bme.mit.theta.core.type.booltype import hu.bme.mit.theta.core.type.Expr -/** - * Utility methods for smart construction and simplification of boolean expressions. - */ +/** Utility methods for smart construction and simplification of boolean expressions. */ @Suppress("FunctionName") object SmartBoolExprs { - @JvmStatic - fun Not(op: Expr): Expr = when (op) { - BoolExprs.True() -> BoolExprs.False() - BoolExprs.False() -> BoolExprs.True() - is NotExpr -> op.op - else -> BoolExprs.Not(op) + @JvmStatic + fun Not(op: Expr): Expr = + when (op) { + BoolExprs.True() -> BoolExprs.False() + BoolExprs.False() -> BoolExprs.True() + is NotExpr -> op.op + else -> BoolExprs.Not(op) } - @JvmStatic - fun Imply(leftOp: Expr, rightOp: Expr): Expr = when { - leftOp == BoolExprs.False() -> BoolExprs.True() - leftOp == BoolExprs.True() -> rightOp - rightOp == BoolExprs.False() -> Not(leftOp) - rightOp == BoolExprs.True() -> BoolExprs.True() - else -> BoolExprs.Imply(leftOp, rightOp) + @JvmStatic + fun Imply(leftOp: Expr, rightOp: Expr): Expr = + when { + leftOp == BoolExprs.False() -> BoolExprs.True() + leftOp == BoolExprs.True() -> rightOp + rightOp == BoolExprs.False() -> Not(leftOp) + rightOp == BoolExprs.True() -> BoolExprs.True() + else -> BoolExprs.Imply(leftOp, rightOp) } - @JvmStatic - fun And(ops: Collection>): Expr { - if (ops.isEmpty()) return BoolExprs.True() - if (BoolExprs.False() in ops) return BoolExprs.False() - val filteredOps = ops.filter { it != BoolExprs.True() } - return when (filteredOps.size) { - 0 -> BoolExprs.True() - 1 -> filteredOps.single() - else -> BoolExprs.And(filteredOps) - } + @JvmStatic + fun And(ops: Collection>): Expr { + if (ops.isEmpty()) return BoolExprs.True() + if (BoolExprs.False() in ops) return BoolExprs.False() + val filteredOps = ops.filter { it != BoolExprs.True() } + return when (filteredOps.size) { + 0 -> BoolExprs.True() + 1 -> filteredOps.single() + else -> BoolExprs.And(filteredOps) } + } - @JvmStatic - fun Or(ops: Collection>): Expr { - if (ops.isEmpty()) return BoolExprs.False() - if (BoolExprs.True() in ops) return BoolExprs.True() - val filteredOps = ops.filter { it != BoolExprs.False() } - return when (filteredOps.size) { - 0 -> BoolExprs.False() - 1 -> filteredOps.single() - else -> BoolExprs.Or(filteredOps) - } + @JvmStatic + fun Or(ops: Collection>): Expr { + if (ops.isEmpty()) return BoolExprs.False() + if (BoolExprs.True() in ops) return BoolExprs.True() + val filteredOps = ops.filter { it != BoolExprs.False() } + return when (filteredOps.size) { + 0 -> BoolExprs.False() + 1 -> filteredOps.single() + else -> BoolExprs.Or(filteredOps) } + } - // Convenience methods - @JvmStatic - fun And(vararg ops: Expr) = And(ops.toList()) + // Convenience methods + @JvmStatic fun And(vararg ops: Expr) = And(ops.toList()) - @JvmStatic - fun Or(vararg ops: Expr) = Or(ops.toList()) + @JvmStatic fun Or(vararg ops: Expr) = Or(ops.toList()) } - diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/XorExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/XorExpr.kt index 3cd231d373..8723fca97f 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/XorExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/XorExpr.kt @@ -1,3 +1,18 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package hu.bme.mit.theta.core.type.booltype import hu.bme.mit.theta.core.model.Valuation @@ -8,34 +23,30 @@ import hu.bme.mit.theta.core.utils.TypeUtils.cast import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -/** - * Logical XOR expression for boolean type. - */ +/** Logical XOR expression for boolean type. */ @Serializable @SerialName("Xor") -data class XorExpr( - override val leftOp: Expr, - override val rightOp: Expr -) : NeqExpr() { +data class XorExpr(override val leftOp: Expr, override val rightOp: Expr) : + NeqExpr() { - companion object { + companion object { - private const val OPERATOR_LABEL = "xor" + private const val OPERATOR_LABEL = "xor" - @JvmStatic - fun of(leftOp: Expr, rightOp: Expr) = XorExpr(leftOp, rightOp) + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = XorExpr(leftOp, rightOp) - @JvmStatic - fun create(leftOp: Expr<*>, rightOp: Expr<*>) = XorExpr(cast(leftOp, Bool()), cast(rightOp, Bool())) - } + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + XorExpr(cast(leftOp, Bool()), cast(rightOp, Bool())) + } - override val operatorLabel: String get() = OPERATOR_LABEL + override val operatorLabel: String + get() = OPERATOR_LABEL - override fun eval(`val`: Valuation): BoolLitExpr = - Bool((leftOp.eval(`val`) as BoolLitExpr).value != (rightOp.eval(`val`) as BoolLitExpr).value) + override fun eval(`val`: Valuation): BoolLitExpr = + Bool((leftOp.eval(`val`) as BoolLitExpr).value != (rightOp.eval(`val`) as BoolLitExpr).value) - override fun new(leftOp: Expr, rightOp: Expr): XorExpr = - of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): XorExpr = of(leftOp, rightOp) - override fun toString(): String = super.toString() + override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvAddExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvAddExpr.kt index 5c3dfb980c..ca750b95f5 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvAddExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvAddExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.bvtype import hu.bme.mit.theta.core.model.Valuation @@ -25,30 +24,28 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("BvAdd") -data class BvAddExpr( - override val ops: List> -) : AddExpr() { +data class BvAddExpr(override val ops: List>) : AddExpr() { - companion object { - private const val OPERATOR_LABEL = "bvadd" + companion object { + private const val OPERATOR_LABEL = "bvadd" - @JvmStatic - fun of(ops: Iterable>) = BvAddExpr(ops.toList()) + @JvmStatic fun of(ops: Iterable>) = BvAddExpr(ops.toList()) - @JvmStatic - fun create(ops: List>) = BvAddExpr(ops.map { TypeUtils.castBv(it) }) - } + @JvmStatic fun create(ops: List>) = BvAddExpr(ops.map { TypeUtils.castBv(it) }) + } - override val type: BvType get() = ops[0].type + override val type: BvType + get() = ops[0].type - override fun eval(`val`: Valuation): BvLitExpr = ops.drop(1).fold(ops[0].eval(`val`) as BvLitExpr) { acc, op -> - acc.add(op.eval(`val`) as BvLitExpr) + override fun eval(`val`: Valuation): BvLitExpr = + ops.drop(1).fold(ops[0].eval(`val`) as BvLitExpr) { acc, op -> + acc.add(op.eval(`val`) as BvLitExpr) } - override fun new(ops: List>): BvAddExpr = of(ops) + override fun new(ops: List>): BvAddExpr = of(ops) - override val operatorLabel: String get() = OPERATOR_LABEL + override val operatorLabel: String + get() = OPERATOR_LABEL - override fun toString(): String = super.toString() + override fun toString(): String = super.toString() } - diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvAndExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvAndExpr.kt index 2134decccb..e9970fd030 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvAndExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvAndExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.bvtype import hu.bme.mit.theta.core.model.Valuation @@ -25,29 +24,28 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("BvAnd") -data class BvAndExpr( - override val ops: List> -) : MultiaryExpr() { +data class BvAndExpr(override val ops: List>) : MultiaryExpr() { - companion object { - private const val OPERATOR_LABEL = "bvand" + companion object { + private const val OPERATOR_LABEL = "bvand" - @JvmStatic - fun of(ops: Iterable>) = BvAndExpr(ops.toList()) + @JvmStatic fun of(ops: Iterable>) = BvAndExpr(ops.toList()) - @JvmStatic - fun create(ops: List>) = BvAndExpr(ops.map { TypeUtils.castBv(it) }) - } + @JvmStatic fun create(ops: List>) = BvAndExpr(ops.map { TypeUtils.castBv(it) }) + } - override val type: BvType get() = ops[0].type + override val type: BvType + get() = ops[0].type - override fun eval(`val`: Valuation): BvLitExpr = ops.drop(1).fold(ops[0].eval(`val`) as BvLitExpr) { acc, op -> - acc.and(op.eval(`val`) as BvLitExpr) + override fun eval(`val`: Valuation): BvLitExpr = + ops.drop(1).fold(ops[0].eval(`val`) as BvLitExpr) { acc, op -> + acc.and(op.eval(`val`) as BvLitExpr) } - override fun new(ops: List>): BvAndExpr = of(ops) + override fun new(ops: List>): BvAndExpr = of(ops) - override val operatorLabel: String get() = OPERATOR_LABEL + override val operatorLabel: String + get() = OPERATOR_LABEL - override fun toString(): String = super.toString() + override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvArithShiftRightExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvArithShiftRightExpr.kt index 23b9fcdfe1..9f951d5ea2 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvArithShiftRightExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvArithShiftRightExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.bvtype import hu.bme.mit.theta.core.model.Valuation @@ -26,31 +25,35 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("BvArithShiftRight") data class BvArithShiftRightExpr( - override val leftOp: Expr, - override val rightOp: Expr + override val leftOp: Expr, + override val rightOp: Expr, ) : BinaryExpr() { - companion object { - private const val OPERATOR_LABEL = "bvashr" + companion object { + private const val OPERATOR_LABEL = "bvashr" - @JvmStatic - fun of(leftOp: Expr, rightOp: Expr) = BvArithShiftRightExpr(leftOp, rightOp) + @JvmStatic + fun of(leftOp: Expr, rightOp: Expr) = BvArithShiftRightExpr(leftOp, rightOp) - @JvmStatic - fun create(leftOp: Expr<*>, rightOp: Expr<*>) = BvArithShiftRightExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) - } + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + BvArithShiftRightExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) + } - override val type: BvType get() = leftOp.type + override val type: BvType + get() = leftOp.type - override fun eval(`val`: Valuation): BvLitExpr { - val leftOpVal = leftOp.eval(`val`) as BvLitExpr - val rightOpVal = rightOp.eval(`val`) as BvLitExpr - return leftOpVal.arithShiftRight(rightOpVal) - } + override fun eval(`val`: Valuation): BvLitExpr { + val leftOpVal = leftOp.eval(`val`) as BvLitExpr + val rightOpVal = rightOp.eval(`val`) as BvLitExpr + return leftOpVal.arithShiftRight(rightOpVal) + } - override fun new(leftOp: Expr, rightOp: Expr): BvArithShiftRightExpr = of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): BvArithShiftRightExpr = + of(leftOp, rightOp) - override val operatorLabel: String get() = OPERATOR_LABEL + override val operatorLabel: String + get() = OPERATOR_LABEL - override fun toString(): String = super.toString() + override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvConcatExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvConcatExpr.kt index 264e9f9ae1..bb56ded125 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvConcatExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvConcatExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.bvtype import hu.bme.mit.theta.common.Utils @@ -25,26 +24,26 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("BvConcat") -data class BvConcatExpr( - override val ops: List> -) : Expr { +data class BvConcatExpr(override val ops: List>) : Expr { + + companion object { - companion object { + private const val OPERATOR_LABEL = "++" - private const val OPERATOR_LABEL = "++" + @JvmStatic fun of(ops: Iterable>) = BvConcatExpr(ops.toList()) - @JvmStatic - fun of(ops: Iterable>) = BvConcatExpr(ops.toList()) + @JvmStatic fun create(ops: List>) = BvConcatExpr(ops.map { TypeUtils.castBv(it) }) + } - @JvmStatic - fun create(ops: List>) = BvConcatExpr(ops.map { TypeUtils.castBv(it) }) + override val type: BvType = BvType.of(ops.sumOf { it.type.size }) + + override fun eval(`val`: Valuation): BvLitExpr = + ops.drop(1).fold(ops[0].eval(`val`) as BvLitExpr) { acc, op -> + acc.concat(op.eval(`val`) as BvLitExpr) } - override val type: BvType = BvType.of(ops.sumOf { it.type.size }) - override fun eval(`val`: Valuation): BvLitExpr = - ops.drop(1).fold(ops[0].eval(`val`) as BvLitExpr) { acc, op -> acc.concat(op.eval(`val`) as BvLitExpr) } + override fun withOps(ops: List>): Expr = of(ops.map { TypeUtils.castBv(it) }) - override fun withOps(ops: List>): Expr = of(ops.map { TypeUtils.castBv(it) }) - override fun toString(): String = Utils.lispStringBuilder(OPERATOR_LABEL).body().addAll(ops).toString() + override fun toString(): String = + Utils.lispStringBuilder(OPERATOR_LABEL).body().addAll(ops).toString() } - diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvEqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvEqExpr.kt index cee3a03512..bab7497146 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvEqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvEqExpr.kt @@ -13,47 +13,46 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.bvtype import hu.bme.mit.theta.core.model.Valuation import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.abstracttype.EqExpr +import hu.bme.mit.theta.core.type.booltype.BoolExprs import hu.bme.mit.theta.core.type.booltype.BoolLitExpr import hu.bme.mit.theta.core.type.booltype.BoolType -import hu.bme.mit.theta.core.type.booltype.BoolExprs import hu.bme.mit.theta.core.utils.TypeUtils import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable @SerialName("BvEq") -data class BvEqExpr( - override val leftOp: Expr, - override val rightOp: Expr -) : EqExpr() { +data class BvEqExpr(override val leftOp: Expr, override val rightOp: Expr) : + EqExpr() { - companion object { - private const val OPERATOR_LABEL = "=" + companion object { + private const val OPERATOR_LABEL = "=" - @JvmStatic - fun of(leftOp: Expr, rightOp: Expr) = BvEqExpr(leftOp, rightOp) + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = BvEqExpr(leftOp, rightOp) - @JvmStatic - fun create(leftOp: Expr<*>, rightOp: Expr<*>) = BvEqExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) - } + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + BvEqExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) + } - override val type: BoolType get() = BoolExprs.Bool() + override val type: BoolType + get() = BoolExprs.Bool() - override fun eval(`val`: Valuation): BoolLitExpr { - val leftOpVal = leftOp.eval(`val`) as BvLitExpr - val rightOpVal = rightOp.eval(`val`) as BvLitExpr - return leftOpVal.eq(rightOpVal) - } + override fun eval(`val`: Valuation): BoolLitExpr { + val leftOpVal = leftOp.eval(`val`) as BvLitExpr + val rightOpVal = rightOp.eval(`val`) as BvLitExpr + return leftOpVal.eq(rightOpVal) + } - override fun new(leftOp: Expr, rightOp: Expr): BvEqExpr = of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): BvEqExpr = of(leftOp, rightOp) - override val operatorLabel: String get() = OPERATOR_LABEL + override val operatorLabel: String + get() = OPERATOR_LABEL - override fun toString(): String = super.toString() + override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvExprs.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvExprs.kt index 6c16d8d795..b86579041b 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvExprs.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvExprs.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.bvtype import hu.bme.mit.theta.core.type.Expr @@ -22,114 +21,86 @@ import hu.bme.mit.theta.core.type.inttype.IntLitExpr @Suppress("FunctionName") object BvExprs { - @JvmStatic - fun BvType(size: Int) = BvType.of(size, null) + @JvmStatic fun BvType(size: Int) = BvType.of(size, null) - @JvmStatic - fun BvType(size: Int, signedness: Boolean?) = BvType.of(size, signedness) + @JvmStatic fun BvType(size: Int, signedness: Boolean?) = BvType.of(size, signedness) - @JvmStatic - fun Bv(value: BooleanArray) = BvLitExpr(value, null) + @JvmStatic fun Bv(value: BooleanArray) = BvLitExpr(value, null) - @JvmStatic - fun Bv(value: BooleanArray, signedness: Boolean?) = BvLitExpr(value, signedness) + @JvmStatic fun Bv(value: BooleanArray, signedness: Boolean?) = BvLitExpr(value, signedness) - @JvmStatic - fun Concat(ops: Iterable>) = BvConcatExpr.of(ops) + @JvmStatic fun Concat(ops: Iterable>) = BvConcatExpr.of(ops) - @JvmStatic - fun Extract(bitvec: Expr, from: IntLitExpr, until: IntLitExpr) = BvExtractExpr(bitvec, from, until) + @JvmStatic + fun Extract(bitvec: Expr, from: IntLitExpr, until: IntLitExpr) = + BvExtractExpr(bitvec, from, until) - @JvmStatic - fun ZExt(bitvec: Expr, extendType: BvType) = BvZExtExpr(bitvec, extendType) + @JvmStatic fun ZExt(bitvec: Expr, extendType: BvType) = BvZExtExpr(bitvec, extendType) - @JvmStatic - fun SExt(bitvec: Expr, extendType: BvType) = BvSExtExpr(bitvec, extendType) + @JvmStatic fun SExt(bitvec: Expr, extendType: BvType) = BvSExtExpr(bitvec, extendType) - @JvmStatic - fun Add(ops: Iterable>) = BvAddExpr.of(ops) + @JvmStatic fun Add(ops: Iterable>) = BvAddExpr.of(ops) - @JvmStatic - fun Sub(leftOp: Expr, rightOp: Expr) = BvSubExpr(leftOp, rightOp) + @JvmStatic fun Sub(leftOp: Expr, rightOp: Expr) = BvSubExpr(leftOp, rightOp) - @JvmStatic - fun Pos(op: Expr) = BvPosExpr(op) + @JvmStatic fun Pos(op: Expr) = BvPosExpr(op) - @JvmStatic - fun Neg(op: Expr) = BvNegExpr(op) + @JvmStatic fun Neg(op: Expr) = BvNegExpr(op) - @JvmStatic - fun Mul(ops: Iterable>) = BvMulExpr.of(ops) + @JvmStatic fun Mul(ops: Iterable>) = BvMulExpr.of(ops) - @JvmStatic - fun UDiv(leftOp: Expr, rightOp: Expr) = BvUDivExpr(leftOp, rightOp) + @JvmStatic fun UDiv(leftOp: Expr, rightOp: Expr) = BvUDivExpr(leftOp, rightOp) - @JvmStatic - fun SDiv(leftOp: Expr, rightOp: Expr) = BvSDivExpr(leftOp, rightOp) + @JvmStatic fun SDiv(leftOp: Expr, rightOp: Expr) = BvSDivExpr(leftOp, rightOp) - @JvmStatic - fun SMod(leftOp: Expr, rightOp: Expr) = BvSModExpr(leftOp, rightOp) + @JvmStatic fun SMod(leftOp: Expr, rightOp: Expr) = BvSModExpr(leftOp, rightOp) - @JvmStatic - fun URem(leftOp: Expr, rightOp: Expr) = BvURemExpr(leftOp, rightOp) + @JvmStatic fun URem(leftOp: Expr, rightOp: Expr) = BvURemExpr(leftOp, rightOp) - @JvmStatic - fun SRem(leftOp: Expr, rightOp: Expr) = BvSRemExpr(leftOp, rightOp) + @JvmStatic fun SRem(leftOp: Expr, rightOp: Expr) = BvSRemExpr(leftOp, rightOp) - @JvmStatic - fun Or(ops: Iterable>) = BvOrExpr.of(ops) + @JvmStatic fun Or(ops: Iterable>) = BvOrExpr.of(ops) - @JvmStatic - fun And(ops: Iterable>) = BvAndExpr.of(ops) + @JvmStatic fun And(ops: Iterable>) = BvAndExpr.of(ops) - @JvmStatic - fun Xor(ops: Iterable>) = BvXorExpr.of(ops) + @JvmStatic fun Xor(ops: Iterable>) = BvXorExpr.of(ops) - @JvmStatic - fun Not(op: Expr) = BvNotExpr(op) + @JvmStatic fun Not(op: Expr) = BvNotExpr(op) - @JvmStatic - fun ShiftLeft(leftOp: Expr, rightOp: Expr) = BvShiftLeftExpr(leftOp, rightOp) + @JvmStatic + fun ShiftLeft(leftOp: Expr, rightOp: Expr) = BvShiftLeftExpr(leftOp, rightOp) - @JvmStatic - fun ArithShiftRight(leftOp: Expr, rightOp: Expr) = BvArithShiftRightExpr(leftOp, rightOp) + @JvmStatic + fun ArithShiftRight(leftOp: Expr, rightOp: Expr) = + BvArithShiftRightExpr(leftOp, rightOp) - @JvmStatic - fun LogicShiftRight(leftOp: Expr, rightOp: Expr) = BvLogicShiftRightExpr(leftOp, rightOp) + @JvmStatic + fun LogicShiftRight(leftOp: Expr, rightOp: Expr) = + BvLogicShiftRightExpr(leftOp, rightOp) - @JvmStatic - fun RotateLeft(leftOp: Expr, rightOp: Expr) = BvRotateLeftExpr(leftOp, rightOp) + @JvmStatic + fun RotateLeft(leftOp: Expr, rightOp: Expr) = BvRotateLeftExpr(leftOp, rightOp) - @JvmStatic - fun RotateRight(leftOp: Expr, rightOp: Expr) = BvRotateRightExpr(leftOp, rightOp) + @JvmStatic + fun RotateRight(leftOp: Expr, rightOp: Expr) = BvRotateRightExpr(leftOp, rightOp) - @JvmStatic - fun Eq(leftOp: Expr, rightOp: Expr) = BvEqExpr(leftOp, rightOp) + @JvmStatic fun Eq(leftOp: Expr, rightOp: Expr) = BvEqExpr(leftOp, rightOp) - @JvmStatic - fun Neq(leftOp: Expr, rightOp: Expr) = BvNeqExpr(leftOp, rightOp) + @JvmStatic fun Neq(leftOp: Expr, rightOp: Expr) = BvNeqExpr(leftOp, rightOp) - @JvmStatic - fun ULt(leftOp: Expr, rightOp: Expr) = BvULtExpr(leftOp, rightOp) + @JvmStatic fun ULt(leftOp: Expr, rightOp: Expr) = BvULtExpr(leftOp, rightOp) - @JvmStatic - fun ULeq(leftOp: Expr, rightOp: Expr) = BvULeqExpr(leftOp, rightOp) + @JvmStatic fun ULeq(leftOp: Expr, rightOp: Expr) = BvULeqExpr(leftOp, rightOp) - @JvmStatic - fun UGt(leftOp: Expr, rightOp: Expr) = BvUGtExpr(leftOp, rightOp) + @JvmStatic fun UGt(leftOp: Expr, rightOp: Expr) = BvUGtExpr(leftOp, rightOp) - @JvmStatic - fun UGeq(leftOp: Expr, rightOp: Expr) = BvUGeqExpr(leftOp, rightOp) + @JvmStatic fun UGeq(leftOp: Expr, rightOp: Expr) = BvUGeqExpr(leftOp, rightOp) - @JvmStatic - fun SLt(leftOp: Expr, rightOp: Expr) = BvSLtExpr(leftOp, rightOp) + @JvmStatic fun SLt(leftOp: Expr, rightOp: Expr) = BvSLtExpr(leftOp, rightOp) - @JvmStatic - fun SLeq(leftOp: Expr, rightOp: Expr) = BvSLeqExpr(leftOp, rightOp) + @JvmStatic fun SLeq(leftOp: Expr, rightOp: Expr) = BvSLeqExpr(leftOp, rightOp) - @JvmStatic - fun SGt(leftOp: Expr, rightOp: Expr) = BvSGtExpr(leftOp, rightOp) + @JvmStatic fun SGt(leftOp: Expr, rightOp: Expr) = BvSGtExpr(leftOp, rightOp) - @JvmStatic - fun SGeq(leftOp: Expr, rightOp: Expr) = BvSGeqExpr(leftOp, rightOp) + @JvmStatic fun SGeq(leftOp: Expr, rightOp: Expr) = BvSGeqExpr(leftOp, rightOp) } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvExtractExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvExtractExpr.kt index e94120fe5f..037f79cce0 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvExtractExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvExtractExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.bvtype import hu.bme.mit.theta.common.Utils @@ -28,55 +27,48 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("BvExtract") -data class BvExtractExpr( - val bitvec: Expr, - val from: IntLitExpr, - val until: IntLitExpr -) : Expr { +data class BvExtractExpr(val bitvec: Expr, val from: IntLitExpr, val until: IntLitExpr) : + Expr { - companion object { + companion object { - private const val OPERATOR_LABEL = "extract" + private const val OPERATOR_LABEL = "extract" - @JvmStatic - fun of(bitvec: Expr, from: IntLitExpr, until: IntLitExpr) = BvExtractExpr(bitvec, from, until) + @JvmStatic + fun of(bitvec: Expr, from: IntLitExpr, until: IntLitExpr) = + BvExtractExpr(bitvec, from, until) - @JvmStatic - fun create(bitvec: Expr<*>, from: Expr<*>, until: Expr<*>): BvExtractExpr { - val newBitvec = castBv(bitvec) - val newFrom = TypeUtils.cast(from, Int()) as IntLitExpr - val newUntil = TypeUtils.cast(until, Int()) as IntLitExpr - return of(newBitvec, newFrom, newUntil) - } + @JvmStatic + fun create(bitvec: Expr<*>, from: Expr<*>, until: Expr<*>): BvExtractExpr { + val newBitvec = castBv(bitvec) + val newFrom = TypeUtils.cast(from, Int()) as IntLitExpr + val newUntil = TypeUtils.cast(until, Int()) as IntLitExpr + return of(newBitvec, newFrom, newUntil) } + } - override val arity: Int = 3 - override val type: BvType = BvType.of(until.value.subtract(from.value).toInt()) - override val ops: List> = listOf(bitvec, from, until) + override val arity: Int = 3 + override val type: BvType = BvType.of(until.value.subtract(from.value).toInt()) + override val ops: List> = listOf(bitvec, from, until) - override fun eval(`val`: Valuation): BvLitExpr { - val bitvecVal = bitvec.eval(`val`) as BvLitExpr - return bitvecVal.extract(from, until) - } + override fun eval(`val`: Valuation): BvLitExpr { + val bitvecVal = bitvec.eval(`val`) as BvLitExpr + return bitvecVal.extract(from, until) + } - override fun withOps(ops: List>): Expr { - require(ops.size == 3) - val newBitvec = castBv(ops[0]) - val newFrom = TypeUtils.cast(ops[1], Int()) as IntLitExpr - val newUntil = TypeUtils.cast(ops[2], Int()) as IntLitExpr + override fun withOps(ops: List>): Expr { + require(ops.size == 3) + val newBitvec = castBv(ops[0]) + val newFrom = TypeUtils.cast(ops[1], Int()) as IntLitExpr + val newUntil = TypeUtils.cast(ops[2], Int()) as IntLitExpr - return if (bitvec == newBitvec && from == newFrom && until == newUntil) { - this - } else { - of(newBitvec, newFrom, newUntil) - } + return if (bitvec == newBitvec && from == newFrom && until == newUntil) { + this + } else { + of(newBitvec, newFrom, newUntil) } + } - override fun toString(): String = Utils.lispStringBuilder(OPERATOR_LABEL) - .body() - .add(bitvec) - .add(from) - .add(until) - .toString() + override fun toString(): String = + Utils.lispStringBuilder(OPERATOR_LABEL).body().add(bitvec).add(from).add(until).toString() } - diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvLitExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvLitExpr.kt index 38e11fec1e..7344d3e83d 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvLitExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvLitExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.bvtype import hu.bme.mit.theta.core.model.Valuation @@ -23,380 +22,360 @@ import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool import hu.bme.mit.theta.core.type.booltype.BoolLitExpr import hu.bme.mit.theta.core.type.inttype.IntLitExpr import hu.bme.mit.theta.core.utils.BvUtils.* +import java.math.BigInteger +import kotlin.concurrent.Volatile import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable import kotlinx.serialization.Transient -import java.math.BigInteger -import kotlin.concurrent.Volatile @Serializable @SerialName("BvLit") -data class BvLitExpr( - val value: BooleanArray, - val signed: Boolean? = null -) : NullaryExpr(), LitExpr, Comparable { - - init { - require(value.isNotEmpty()) { "Bitvector must have positive size." } - } - - companion object { - - private const val HASH_SEED: Int = 5624 - - @JvmStatic - fun of(value: BooleanArray, signed: Boolean? = null) = BvLitExpr(value, signed) - } - - @Volatile - @Transient - private var hashCode = 0 - - override val type: BvType get() = BvType(value.size, signed) - override fun eval(`val`: Valuation): BvLitExpr = this - - fun concat(that: BvLitExpr): BvLitExpr { - val concatenated = BooleanArray(this.type.size + that.type.size) - for (i in 0 until this.type.size) concatenated[i] = this.value[i] - for (i in 0 until that.type.size) concatenated[this.type.size + i] = that.value[i] - return of(concatenated) - } - - fun extract(from: IntLitExpr, until: IntLitExpr): BvLitExpr { - val fromValue = from.value.toInt() - val untilValue = until.value.toInt() - require(fromValue >= 0 && untilValue >= 0 && untilValue > fromValue) - val extracted = BooleanArray(untilValue - fromValue) - for (i in extracted.indices) { - extracted[extracted.size - i - 1] = this.value[this.value.size - (fromValue + i) - 1] - } - return of(extracted) - } - - fun zext(extendType: BvType): BvLitExpr { - require(extendType.size >= this.type.size) - val extended = BooleanArray(extendType.size) - for (i in this.value.indices) { - extended[extended.size - i - 1] = this.value[this.value.size - i - 1] - } - for (i in 0 until extendType.size - this.type.size) { - extended[i] = false - } - return of(extended) - } - - fun sext(extendType: BvType): BvLitExpr { - require(extendType.size >= this.type.size) - val extended = BooleanArray(extendType.size) - for (i in this.value.indices) { - extended[extended.size - i - 1] = this.value[this.value.size - i - 1] - } - for (i in 0 until extendType.size - this.type.size) { - extended[i] = this.value[0] - } - return of(extended) - } - - fun add(that: BvLitExpr): BvLitExpr { - require(this.type == that.type) - var sum = neutralBvLitExprToBigInteger(this).add(neutralBvLitExprToBigInteger(that)) - sum = fitBigIntegerIntoNeutralDomain(sum, type.size) - return bigIntegerToNeutralBvLitExpr(sum, type.size) - } - - fun sub(that: BvLitExpr): BvLitExpr { - require(this.type == that.type) - var sub = neutralBvLitExprToBigInteger(this).subtract(neutralBvLitExprToBigInteger(that)) - sub = fitBigIntegerIntoNeutralDomain(sub, type.size) - return bigIntegerToNeutralBvLitExpr(sub, type.size) - } - - fun mul(that: BvLitExpr): BvLitExpr { - require(this.type == that.type) - var prod = neutralBvLitExprToBigInteger(this).multiply(neutralBvLitExprToBigInteger(that)) - prod = fitBigIntegerIntoNeutralDomain(prod, type.size) - return bigIntegerToNeutralBvLitExpr(prod, type.size) - } - - fun pos(): BvLitExpr { - var pos = signedBvLitExprToBigInteger(this) - pos = fitBigIntegerIntoSignedDomain(pos, type.size) - return bigIntegerToSignedBvLitExpr(pos, type.size) - } - - fun neg(): BvLitExpr { - var neg = signedBvLitExprToBigInteger(this).negate() - neg = fitBigIntegerIntoSignedDomain(neg, type.size) - return bigIntegerToSignedBvLitExpr(neg, type.size) - } - - fun udiv(that: BvLitExpr): BvLitExpr { - require(this.type == that.type) - var div = unsignedBvLitExprToBigInteger(this).divide(unsignedBvLitExprToBigInteger(that)) - div = fitBigIntegerIntoUnsignedDomain(div, type.size) - return bigIntegerToUnsignedBvLitExpr(div, type.size) - } - - fun sdiv(that: BvLitExpr): BvLitExpr { - require(this.type == that.type) - var div = signedBvLitExprToBigInteger(this).divide(signedBvLitExprToBigInteger(that)) - div = fitBigIntegerIntoSignedDomain(div, type.size) - return bigIntegerToSignedBvLitExpr(div, type.size) - } - - fun and(that: BvLitExpr): BvLitExpr { - require(this.type == that.type) - val and = neutralBvLitExprToBigInteger(this).and(neutralBvLitExprToBigInteger(that)) - return bigIntegerToNeutralBvLitExpr(and, type.size) - } - - fun or(that: BvLitExpr): BvLitExpr { - require(this.type == that.type) - val or = neutralBvLitExprToBigInteger(this).or(neutralBvLitExprToBigInteger(that)) - return bigIntegerToNeutralBvLitExpr(or, type.size) - } - - fun xor(that: BvLitExpr): BvLitExpr { - require(this.type == that.type) - val xor = neutralBvLitExprToBigInteger(this).xor(neutralBvLitExprToBigInteger(that)) - return bigIntegerToNeutralBvLitExpr(xor, type.size) - } - - fun not(): BvLitExpr { - val not = neutralBvLitExprToBigInteger(this).not() - return bigIntegerToNeutralBvLitExpr(not, type.size) - } - - fun shiftLeft(that: BvLitExpr): BvLitExpr { - require(this.type == that.type) - val shifted = value.copyOf(value.size) - val shift = neutralBvLitExprToBigInteger(that) - var i = BigInteger.ZERO - while (i < shift) { - for (j in 0 until shifted.size - 1) { - shifted[j] = shifted[j + 1] - } - shifted[shifted.size - 1] = false - i = i.add(BigInteger.ONE) - } - return of(shifted) - } - - fun arithShiftRight(that: BvLitExpr): BvLitExpr { - require(this.type == that.type) - val shifted = value.copyOf(value.size) - val insert = shifted[0] - val shift = neutralBvLitExprToBigInteger(that) - var i = BigInteger.ZERO - while (i < shift) { - for (j in shifted.size - 1 downTo 1) { - shifted[j] = shifted[j - 1] - } - shifted[0] = insert - i = i.add(BigInteger.ONE) - } - return of(shifted) - } - - fun logicShiftRight(that: BvLitExpr): BvLitExpr { - require(this.type == that.type) - val shifted = value.copyOf(value.size) - val shift = neutralBvLitExprToBigInteger(that) - var i = BigInteger.ZERO - while (i < shift) { - for (j in shifted.size - 1 downTo 1) { - shifted[j] = shifted[j - 1] - } - shifted[0] = false - i = i.add(BigInteger.ONE) - } - return of(shifted) - } - - fun rotateLeft(that: BvLitExpr): BvLitExpr { - require(this.type == that.type) - val shifted = value.copyOf(value.size) - val shift = neutralBvLitExprToBigInteger(that) - var i = BigInteger.ZERO - while (i < shift) { - val rotated = shifted[0] - for (j in 0 until shifted.size - 1) { - shifted[j] = shifted[j + 1] - } - shifted[shifted.size - 1] = rotated - i = i.add(BigInteger.ONE) - } - return of(shifted) - } - - fun rotateRight(that: BvLitExpr): BvLitExpr { - require(this.type == that.type) - val shifted = value.copyOf(value.size) - val shift = neutralBvLitExprToBigInteger(that) - var i = BigInteger.ZERO - while (i < shift) { - val rotated = shifted[shifted.size - 1] - for (j in shifted.size - 1 downTo 1) { - shifted[j] = shifted[j - 1] - } - shifted[0] = rotated - i = i.add(BigInteger.ONE) - } - return of(shifted) - } - - fun smod(that: BvLitExpr): BvLitExpr { - require(this.type == that.type) - // Always positive semantics: - // 5 mod 3 = 2 - // 5 mod -3 = 2 - // -5 mod 3 = 1 - // -5 mod -3 = 1 - var result = signedBvLitExprToBigInteger(this).mod(signedBvLitExprToBigInteger(that)) - if (result < BigInteger.ZERO) { - result = result.add(signedBvLitExprToBigInteger(that).abs()) - } - require(result >= BigInteger.ZERO) - return bigIntegerToSignedBvLitExpr(result, type.size) - } - - fun urem(that: BvLitExpr): BvLitExpr { - // Semantics: - // 5 rem 3 = 2 - val thisInt = signedBvLitExprToBigInteger(this) - val thatInt = signedBvLitExprToBigInteger(that) - return bigIntegerToSignedBvLitExpr(thisInt.mod(thatInt), type.size) - } - - fun srem(that: BvLitExpr): BvLitExpr { - // Semantics: - // 5 rem 3 = 2 - // 5 rem -3 = 2 - // -5 rem 3 = -1 - // -5 rem -3 = -1 - val thisInt = signedBvLitExprToBigInteger(this) - val thatInt = signedBvLitExprToBigInteger(that) - val thisAbs = thisInt.abs() - val thatAbs = thatInt.abs() - return when { - thisInt < BigInteger.ZERO && thatInt < BigInteger.ZERO -> { - bigIntegerToSignedBvLitExpr(thisAbs.mod(thatAbs).negate(), type.size) - } - - thisInt >= BigInteger.ZERO && thatInt < BigInteger.ZERO -> { - bigIntegerToSignedBvLitExpr(thisAbs.mod(thatAbs), type.size) - } - - thisInt < BigInteger.ZERO && thatInt >= BigInteger.ZERO -> { - bigIntegerToSignedBvLitExpr(thisAbs.mod(thatAbs).negate(), type.size) - } - - else -> { - bigIntegerToSignedBvLitExpr(thisInt.mod(thatInt), type.size) - } - } - } - - fun eq(that: BvLitExpr): BoolLitExpr { - require(this.type == that.type) - return Bool(this.value.contentEquals(that.value)) - } - - fun neq(that: BvLitExpr): BoolLitExpr { - require(this.type == that.type) - return Bool(!this.value.contentEquals(that.value)) - } - - fun ult(that: BvLitExpr): BoolLitExpr { - require(this.type == that.type) - return Bool( - unsignedBvLitExprToBigInteger(this) < unsignedBvLitExprToBigInteger(that) - ) - } - - fun ule(that: BvLitExpr): BoolLitExpr { - require(this.type == that.type) - return Bool( - unsignedBvLitExprToBigInteger(this) <= unsignedBvLitExprToBigInteger(that) - ) - } - - fun ugt(that: BvLitExpr): BoolLitExpr { - require(this.type == that.type) - return Bool( - unsignedBvLitExprToBigInteger(this) > unsignedBvLitExprToBigInteger(that) - ) - } - - fun uge(that: BvLitExpr): BoolLitExpr { - require(this.type == that.type) - return Bool( - unsignedBvLitExprToBigInteger(this) >= unsignedBvLitExprToBigInteger(that) - ) - } - - fun slt(that: BvLitExpr): BoolLitExpr { - require(this.type == that.type) - return Bool( - signedBvLitExprToBigInteger(this) < signedBvLitExprToBigInteger(that) - ) - } - - fun sle(that: BvLitExpr): BoolLitExpr { - require(this.type == that.type) - return Bool( - signedBvLitExprToBigInteger(this) <= signedBvLitExprToBigInteger(that) - ) - } - - fun sgt(that: BvLitExpr): BoolLitExpr { - require(this.type == that.type) - return Bool( - signedBvLitExprToBigInteger(this) > signedBvLitExprToBigInteger(that) - ) - } - - fun sge(that: BvLitExpr): BoolLitExpr { - require(this.type == that.type) - return Bool( - signedBvLitExprToBigInteger(this) >= signedBvLitExprToBigInteger(that) - ) - } - - override fun compareTo(other: BvLitExpr): Int { - // Use unsigned comparison for ordering - return unsignedBvLitExprToBigInteger(this).compareTo(unsignedBvLitExprToBigInteger(other)) - } - - - override fun hashCode(): Int { - var result = hashCode - if (result == 0) { - result = HASH_SEED - result = 31 * result + value.contentHashCode() - hashCode = result - } - return result - } - - override fun equals(other: Any?): Boolean { - if (this === other) { - return true - } else if (other != null && this.javaClass == other.javaClass) { - val that = other as BvLitExpr - return value.contentEquals(that.value) - } else { - return false - } - } - - override fun toString(): String { - val sb = StringBuilder() - // sb.append(getType().getSize()); - sb.append("#b") - for (bit in value) { - sb.append(if (bit) "1" else "0") - } - return sb.toString() - } +data class BvLitExpr(val value: BooleanArray, val signed: Boolean? = null) : + NullaryExpr(), LitExpr, Comparable { + + init { + require(value.isNotEmpty()) { "Bitvector must have positive size." } + } + + companion object { + + private const val HASH_SEED: Int = 5624 + + @JvmStatic fun of(value: BooleanArray, signed: Boolean? = null) = BvLitExpr(value, signed) + } + + @Volatile @Transient private var hashCode = 0 + + override val type: BvType + get() = BvType(value.size, signed) + + override fun eval(`val`: Valuation): BvLitExpr = this + + fun concat(that: BvLitExpr): BvLitExpr { + val concatenated = BooleanArray(this.type.size + that.type.size) + for (i in 0 until this.type.size) concatenated[i] = this.value[i] + for (i in 0 until that.type.size) concatenated[this.type.size + i] = that.value[i] + return of(concatenated) + } + + fun extract(from: IntLitExpr, until: IntLitExpr): BvLitExpr { + val fromValue = from.value.toInt() + val untilValue = until.value.toInt() + require(fromValue >= 0 && untilValue >= 0 && untilValue > fromValue) + val extracted = BooleanArray(untilValue - fromValue) + for (i in extracted.indices) { + extracted[extracted.size - i - 1] = this.value[this.value.size - (fromValue + i) - 1] + } + return of(extracted) + } + + fun zext(extendType: BvType): BvLitExpr { + require(extendType.size >= this.type.size) + val extended = BooleanArray(extendType.size) + for (i in this.value.indices) { + extended[extended.size - i - 1] = this.value[this.value.size - i - 1] + } + for (i in 0 until extendType.size - this.type.size) { + extended[i] = false + } + return of(extended) + } + + fun sext(extendType: BvType): BvLitExpr { + require(extendType.size >= this.type.size) + val extended = BooleanArray(extendType.size) + for (i in this.value.indices) { + extended[extended.size - i - 1] = this.value[this.value.size - i - 1] + } + for (i in 0 until extendType.size - this.type.size) { + extended[i] = this.value[0] + } + return of(extended) + } + + fun add(that: BvLitExpr): BvLitExpr { + require(this.type == that.type) + var sum = neutralBvLitExprToBigInteger(this).add(neutralBvLitExprToBigInteger(that)) + sum = fitBigIntegerIntoNeutralDomain(sum, type.size) + return bigIntegerToNeutralBvLitExpr(sum, type.size) + } + + fun sub(that: BvLitExpr): BvLitExpr { + require(this.type == that.type) + var sub = neutralBvLitExprToBigInteger(this).subtract(neutralBvLitExprToBigInteger(that)) + sub = fitBigIntegerIntoNeutralDomain(sub, type.size) + return bigIntegerToNeutralBvLitExpr(sub, type.size) + } + + fun mul(that: BvLitExpr): BvLitExpr { + require(this.type == that.type) + var prod = neutralBvLitExprToBigInteger(this).multiply(neutralBvLitExprToBigInteger(that)) + prod = fitBigIntegerIntoNeutralDomain(prod, type.size) + return bigIntegerToNeutralBvLitExpr(prod, type.size) + } + + fun pos(): BvLitExpr { + var pos = signedBvLitExprToBigInteger(this) + pos = fitBigIntegerIntoSignedDomain(pos, type.size) + return bigIntegerToSignedBvLitExpr(pos, type.size) + } + + fun neg(): BvLitExpr { + var neg = signedBvLitExprToBigInteger(this).negate() + neg = fitBigIntegerIntoSignedDomain(neg, type.size) + return bigIntegerToSignedBvLitExpr(neg, type.size) + } + + fun udiv(that: BvLitExpr): BvLitExpr { + require(this.type == that.type) + var div = unsignedBvLitExprToBigInteger(this).divide(unsignedBvLitExprToBigInteger(that)) + div = fitBigIntegerIntoUnsignedDomain(div, type.size) + return bigIntegerToUnsignedBvLitExpr(div, type.size) + } + + fun sdiv(that: BvLitExpr): BvLitExpr { + require(this.type == that.type) + var div = signedBvLitExprToBigInteger(this).divide(signedBvLitExprToBigInteger(that)) + div = fitBigIntegerIntoSignedDomain(div, type.size) + return bigIntegerToSignedBvLitExpr(div, type.size) + } + + fun and(that: BvLitExpr): BvLitExpr { + require(this.type == that.type) + val and = neutralBvLitExprToBigInteger(this).and(neutralBvLitExprToBigInteger(that)) + return bigIntegerToNeutralBvLitExpr(and, type.size) + } + + fun or(that: BvLitExpr): BvLitExpr { + require(this.type == that.type) + val or = neutralBvLitExprToBigInteger(this).or(neutralBvLitExprToBigInteger(that)) + return bigIntegerToNeutralBvLitExpr(or, type.size) + } + + fun xor(that: BvLitExpr): BvLitExpr { + require(this.type == that.type) + val xor = neutralBvLitExprToBigInteger(this).xor(neutralBvLitExprToBigInteger(that)) + return bigIntegerToNeutralBvLitExpr(xor, type.size) + } + + fun not(): BvLitExpr { + val not = neutralBvLitExprToBigInteger(this).not() + return bigIntegerToNeutralBvLitExpr(not, type.size) + } + + fun shiftLeft(that: BvLitExpr): BvLitExpr { + require(this.type == that.type) + val shifted = value.copyOf(value.size) + val shift = neutralBvLitExprToBigInteger(that) + var i = BigInteger.ZERO + while (i < shift) { + for (j in 0 until shifted.size - 1) { + shifted[j] = shifted[j + 1] + } + shifted[shifted.size - 1] = false + i = i.add(BigInteger.ONE) + } + return of(shifted) + } + + fun arithShiftRight(that: BvLitExpr): BvLitExpr { + require(this.type == that.type) + val shifted = value.copyOf(value.size) + val insert = shifted[0] + val shift = neutralBvLitExprToBigInteger(that) + var i = BigInteger.ZERO + while (i < shift) { + for (j in shifted.size - 1 downTo 1) { + shifted[j] = shifted[j - 1] + } + shifted[0] = insert + i = i.add(BigInteger.ONE) + } + return of(shifted) + } + + fun logicShiftRight(that: BvLitExpr): BvLitExpr { + require(this.type == that.type) + val shifted = value.copyOf(value.size) + val shift = neutralBvLitExprToBigInteger(that) + var i = BigInteger.ZERO + while (i < shift) { + for (j in shifted.size - 1 downTo 1) { + shifted[j] = shifted[j - 1] + } + shifted[0] = false + i = i.add(BigInteger.ONE) + } + return of(shifted) + } + + fun rotateLeft(that: BvLitExpr): BvLitExpr { + require(this.type == that.type) + val shifted = value.copyOf(value.size) + val shift = neutralBvLitExprToBigInteger(that) + var i = BigInteger.ZERO + while (i < shift) { + val rotated = shifted[0] + for (j in 0 until shifted.size - 1) { + shifted[j] = shifted[j + 1] + } + shifted[shifted.size - 1] = rotated + i = i.add(BigInteger.ONE) + } + return of(shifted) + } + + fun rotateRight(that: BvLitExpr): BvLitExpr { + require(this.type == that.type) + val shifted = value.copyOf(value.size) + val shift = neutralBvLitExprToBigInteger(that) + var i = BigInteger.ZERO + while (i < shift) { + val rotated = shifted[shifted.size - 1] + for (j in shifted.size - 1 downTo 1) { + shifted[j] = shifted[j - 1] + } + shifted[0] = rotated + i = i.add(BigInteger.ONE) + } + return of(shifted) + } + + fun smod(that: BvLitExpr): BvLitExpr { + require(this.type == that.type) + // Always positive semantics: + // 5 mod 3 = 2 + // 5 mod -3 = 2 + // -5 mod 3 = 1 + // -5 mod -3 = 1 + var result = signedBvLitExprToBigInteger(this).mod(signedBvLitExprToBigInteger(that)) + if (result < BigInteger.ZERO) { + result = result.add(signedBvLitExprToBigInteger(that).abs()) + } + require(result >= BigInteger.ZERO) + return bigIntegerToSignedBvLitExpr(result, type.size) + } + + fun urem(that: BvLitExpr): BvLitExpr { + // Semantics: + // 5 rem 3 = 2 + val thisInt = signedBvLitExprToBigInteger(this) + val thatInt = signedBvLitExprToBigInteger(that) + return bigIntegerToSignedBvLitExpr(thisInt.mod(thatInt), type.size) + } + + fun srem(that: BvLitExpr): BvLitExpr { + // Semantics: + // 5 rem 3 = 2 + // 5 rem -3 = 2 + // -5 rem 3 = -1 + // -5 rem -3 = -1 + val thisInt = signedBvLitExprToBigInteger(this) + val thatInt = signedBvLitExprToBigInteger(that) + val thisAbs = thisInt.abs() + val thatAbs = thatInt.abs() + return when { + thisInt < BigInteger.ZERO && thatInt < BigInteger.ZERO -> { + bigIntegerToSignedBvLitExpr(thisAbs.mod(thatAbs).negate(), type.size) + } + + thisInt >= BigInteger.ZERO && thatInt < BigInteger.ZERO -> { + bigIntegerToSignedBvLitExpr(thisAbs.mod(thatAbs), type.size) + } + + thisInt < BigInteger.ZERO && thatInt >= BigInteger.ZERO -> { + bigIntegerToSignedBvLitExpr(thisAbs.mod(thatAbs).negate(), type.size) + } + + else -> { + bigIntegerToSignedBvLitExpr(thisInt.mod(thatInt), type.size) + } + } + } + + fun eq(that: BvLitExpr): BoolLitExpr { + require(this.type == that.type) + return Bool(this.value.contentEquals(that.value)) + } + + fun neq(that: BvLitExpr): BoolLitExpr { + require(this.type == that.type) + return Bool(!this.value.contentEquals(that.value)) + } + + fun ult(that: BvLitExpr): BoolLitExpr { + require(this.type == that.type) + return Bool(unsignedBvLitExprToBigInteger(this) < unsignedBvLitExprToBigInteger(that)) + } + + fun ule(that: BvLitExpr): BoolLitExpr { + require(this.type == that.type) + return Bool(unsignedBvLitExprToBigInteger(this) <= unsignedBvLitExprToBigInteger(that)) + } + + fun ugt(that: BvLitExpr): BoolLitExpr { + require(this.type == that.type) + return Bool(unsignedBvLitExprToBigInteger(this) > unsignedBvLitExprToBigInteger(that)) + } + + fun uge(that: BvLitExpr): BoolLitExpr { + require(this.type == that.type) + return Bool(unsignedBvLitExprToBigInteger(this) >= unsignedBvLitExprToBigInteger(that)) + } + + fun slt(that: BvLitExpr): BoolLitExpr { + require(this.type == that.type) + return Bool(signedBvLitExprToBigInteger(this) < signedBvLitExprToBigInteger(that)) + } + + fun sle(that: BvLitExpr): BoolLitExpr { + require(this.type == that.type) + return Bool(signedBvLitExprToBigInteger(this) <= signedBvLitExprToBigInteger(that)) + } + + fun sgt(that: BvLitExpr): BoolLitExpr { + require(this.type == that.type) + return Bool(signedBvLitExprToBigInteger(this) > signedBvLitExprToBigInteger(that)) + } + + fun sge(that: BvLitExpr): BoolLitExpr { + require(this.type == that.type) + return Bool(signedBvLitExprToBigInteger(this) >= signedBvLitExprToBigInteger(that)) + } + + override fun compareTo(other: BvLitExpr): Int { + // Use unsigned comparison for ordering + return unsignedBvLitExprToBigInteger(this).compareTo(unsignedBvLitExprToBigInteger(other)) + } + + override fun hashCode(): Int { + var result = hashCode + if (result == 0) { + result = HASH_SEED + result = 31 * result + value.contentHashCode() + hashCode = result + } + return result + } + + override fun equals(other: Any?): Boolean { + if (this === other) { + return true + } else if (other != null && this.javaClass == other.javaClass) { + val that = other as BvLitExpr + return value.contentEquals(that.value) + } else { + return false + } + } + + override fun toString(): String { + val sb = StringBuilder() + // sb.append(getType().getSize()); + sb.append("#b") + for (bit in value) { + sb.append(if (bit) "1" else "0") + } + return sb.toString() + } } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvLogicShiftRightExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvLogicShiftRightExpr.kt index d84d1b8263..99eda3a1d2 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvLogicShiftRightExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvLogicShiftRightExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.bvtype import hu.bme.mit.theta.core.model.Valuation @@ -26,32 +25,35 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("BvLogicShiftRight") data class BvLogicShiftRightExpr( - override val leftOp: Expr, - override val rightOp: Expr + override val leftOp: Expr, + override val rightOp: Expr, ) : BinaryExpr() { - companion object { - private const val OPERATOR_LABEL = "bvlshr" + companion object { + private const val OPERATOR_LABEL = "bvlshr" - @JvmStatic - fun of(leftOp: Expr, rightOp: Expr) = BvLogicShiftRightExpr(leftOp, rightOp) + @JvmStatic + fun of(leftOp: Expr, rightOp: Expr) = BvLogicShiftRightExpr(leftOp, rightOp) - @JvmStatic - fun create(leftOp: Expr<*>, rightOp: Expr<*>) = BvLogicShiftRightExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) - } + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + BvLogicShiftRightExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) + } - override val type: BvType get() = leftOp.type + override val type: BvType + get() = leftOp.type - override fun eval(`val`: Valuation): BvLitExpr { - val leftOpVal = leftOp.eval(`val`) as BvLitExpr - val rightOpVal = rightOp.eval(`val`) as BvLitExpr - return leftOpVal.logicShiftRight(rightOpVal) - } + override fun eval(`val`: Valuation): BvLitExpr { + val leftOpVal = leftOp.eval(`val`) as BvLitExpr + val rightOpVal = rightOp.eval(`val`) as BvLitExpr + return leftOpVal.logicShiftRight(rightOpVal) + } - override fun new(leftOp: Expr, rightOp: Expr): BvLogicShiftRightExpr = of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): BvLogicShiftRightExpr = + of(leftOp, rightOp) - override val operatorLabel: String get() = OPERATOR_LABEL + override val operatorLabel: String + get() = OPERATOR_LABEL - override fun toString(): String = super.toString() + override fun toString(): String = super.toString() } - diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvMulExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvMulExpr.kt index 948882985a..7305d8e74e 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvMulExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvMulExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.bvtype import hu.bme.mit.theta.core.model.Valuation @@ -25,29 +24,28 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("BvMul") -data class BvMulExpr( - override val ops: List> -) : MulExpr() { +data class BvMulExpr(override val ops: List>) : MulExpr() { - companion object { - private const val OPERATOR_LABEL = "bvmul" + companion object { + private const val OPERATOR_LABEL = "bvmul" - @JvmStatic - fun of(ops: Iterable>) = BvMulExpr(ops.toList()) + @JvmStatic fun of(ops: Iterable>) = BvMulExpr(ops.toList()) - @JvmStatic - fun create(ops: List>) = BvMulExpr(ops.map { TypeUtils.castBv(it) }) - } + @JvmStatic fun create(ops: List>) = BvMulExpr(ops.map { TypeUtils.castBv(it) }) + } - override val type: BvType get() = ops[0].type + override val type: BvType + get() = ops[0].type - override fun eval(`val`: Valuation): BvLitExpr = ops.drop(1).fold(ops[0].eval(`val`) as BvLitExpr) { acc, op -> - acc.mul(op.eval(`val`) as BvLitExpr) + override fun eval(`val`: Valuation): BvLitExpr = + ops.drop(1).fold(ops[0].eval(`val`) as BvLitExpr) { acc, op -> + acc.mul(op.eval(`val`) as BvLitExpr) } - override fun new(ops: List>): BvMulExpr = of(ops) + override fun new(ops: List>): BvMulExpr = of(ops) - override val operatorLabel: String get() = OPERATOR_LABEL + override val operatorLabel: String + get() = OPERATOR_LABEL - override fun toString(): String = super.toString() + override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvNegExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvNegExpr.kt index ce94e1f7b9..7f85069796 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvNegExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvNegExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.bvtype import hu.bme.mit.theta.core.model.Valuation @@ -25,30 +24,28 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("BvNeg") -data class BvNegExpr( - override val op: Expr -) : NegExpr() { +data class BvNegExpr(override val op: Expr) : NegExpr() { - companion object { - private const val OPERATOR_LABEL = "bvneg" + companion object { + private const val OPERATOR_LABEL = "bvneg" - @JvmStatic - fun of(op: Expr) = BvNegExpr(op) + @JvmStatic fun of(op: Expr) = BvNegExpr(op) - @JvmStatic - fun create(op: Expr<*>) = BvNegExpr(TypeUtils.castBv(op)) - } + @JvmStatic fun create(op: Expr<*>) = BvNegExpr(TypeUtils.castBv(op)) + } - override val type: BvType get() = op.type + override val type: BvType + get() = op.type - override fun eval(`val`: Valuation): BvLitExpr { - val opVal = op.eval(`val`) as BvLitExpr - return opVal.neg() - } + override fun eval(`val`: Valuation): BvLitExpr { + val opVal = op.eval(`val`) as BvLitExpr + return opVal.neg() + } - override fun new(op: Expr): BvNegExpr = of(op) + override fun new(op: Expr): BvNegExpr = of(op) - override val operatorLabel: String get() = OPERATOR_LABEL + override val operatorLabel: String + get() = OPERATOR_LABEL - override fun toString(): String = super.toString() + override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvNeqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvNeqExpr.kt index b516fca719..81ee2fe9ca 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvNeqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvNeqExpr.kt @@ -13,47 +13,46 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.bvtype import hu.bme.mit.theta.core.model.Valuation import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.abstracttype.NeqExpr +import hu.bme.mit.theta.core.type.booltype.BoolExprs import hu.bme.mit.theta.core.type.booltype.BoolLitExpr import hu.bme.mit.theta.core.type.booltype.BoolType -import hu.bme.mit.theta.core.type.booltype.BoolExprs import hu.bme.mit.theta.core.utils.TypeUtils import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable @SerialName("BvNeq") -data class BvNeqExpr( - override val leftOp: Expr, - override val rightOp: Expr -) : NeqExpr() { +data class BvNeqExpr(override val leftOp: Expr, override val rightOp: Expr) : + NeqExpr() { - companion object { - private const val OPERATOR_LABEL = "/=" + companion object { + private const val OPERATOR_LABEL = "/=" - @JvmStatic - fun of(leftOp: Expr, rightOp: Expr) = BvNeqExpr(leftOp, rightOp) + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = BvNeqExpr(leftOp, rightOp) - @JvmStatic - fun create(leftOp: Expr<*>, rightOp: Expr<*>) = BvNeqExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) - } + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + BvNeqExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) + } - override val type: BoolType get() = BoolExprs.Bool() + override val type: BoolType + get() = BoolExprs.Bool() - override fun eval(`val`: Valuation): BoolLitExpr { - val leftOpVal = leftOp.eval(`val`) as BvLitExpr - val rightOpVal = rightOp.eval(`val`) as BvLitExpr - return leftOpVal.neq(rightOpVal) - } + override fun eval(`val`: Valuation): BoolLitExpr { + val leftOpVal = leftOp.eval(`val`) as BvLitExpr + val rightOpVal = rightOp.eval(`val`) as BvLitExpr + return leftOpVal.neq(rightOpVal) + } - override fun new(leftOp: Expr, rightOp: Expr): BvNeqExpr = of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): BvNeqExpr = of(leftOp, rightOp) - override val operatorLabel: String get() = OPERATOR_LABEL + override val operatorLabel: String + get() = OPERATOR_LABEL - override fun toString(): String = super.toString() + override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvNotExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvNotExpr.kt index 25c6f41b41..91e4630fe6 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvNotExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvNotExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.bvtype import hu.bme.mit.theta.core.model.Valuation @@ -25,30 +24,28 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("BvNot") -data class BvNotExpr( - override val op: Expr -) : UnaryExpr() { +data class BvNotExpr(override val op: Expr) : UnaryExpr() { - companion object { - private const val OPERATOR_LABEL = "bvnot" + companion object { + private const val OPERATOR_LABEL = "bvnot" - @JvmStatic - fun of(op: Expr) = BvNotExpr(op) + @JvmStatic fun of(op: Expr) = BvNotExpr(op) - @JvmStatic - fun create(op: Expr<*>) = BvNotExpr(TypeUtils.castBv(op)) - } + @JvmStatic fun create(op: Expr<*>) = BvNotExpr(TypeUtils.castBv(op)) + } - override val type: BvType get() = op.type + override val type: BvType + get() = op.type - override fun eval(`val`: Valuation): BvLitExpr { - val opVal = op.eval(`val`) as BvLitExpr - return opVal.not() - } + override fun eval(`val`: Valuation): BvLitExpr { + val opVal = op.eval(`val`) as BvLitExpr + return opVal.not() + } - override fun new(op: Expr): BvNotExpr = of(op) + override fun new(op: Expr): BvNotExpr = of(op) - override val operatorLabel: String get() = OPERATOR_LABEL + override val operatorLabel: String + get() = OPERATOR_LABEL - override fun toString(): String = super.toString() + override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvOrExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvOrExpr.kt index 0cee1f0d7b..37b16882e0 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvOrExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvOrExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.bvtype import hu.bme.mit.theta.core.model.Valuation @@ -25,29 +24,28 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("BvOr") -data class BvOrExpr( - override val ops: List> -) : MultiaryExpr() { +data class BvOrExpr(override val ops: List>) : MultiaryExpr() { - companion object { - private const val OPERATOR_LABEL = "bvor" + companion object { + private const val OPERATOR_LABEL = "bvor" - @JvmStatic - fun of(ops: Iterable>) = BvOrExpr(ops.toList()) + @JvmStatic fun of(ops: Iterable>) = BvOrExpr(ops.toList()) - @JvmStatic - fun create(ops: List>) = BvOrExpr(ops.map { TypeUtils.castBv(it) }) - } + @JvmStatic fun create(ops: List>) = BvOrExpr(ops.map { TypeUtils.castBv(it) }) + } - override val type: BvType get() = ops[0].type + override val type: BvType + get() = ops[0].type - override fun eval(`val`: Valuation): BvLitExpr = ops.drop(1).fold(ops[0].eval(`val`) as BvLitExpr) { acc, op -> - acc.or(op.eval(`val`) as BvLitExpr) + override fun eval(`val`: Valuation): BvLitExpr = + ops.drop(1).fold(ops[0].eval(`val`) as BvLitExpr) { acc, op -> + acc.or(op.eval(`val`) as BvLitExpr) } - override fun new(ops: List>): BvOrExpr = of(ops) + override fun new(ops: List>): BvOrExpr = of(ops) - override val operatorLabel: String get() = OPERATOR_LABEL + override val operatorLabel: String + get() = OPERATOR_LABEL - override fun toString(): String = super.toString() + override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvPosExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvPosExpr.kt index a44a155525..becdfc31d2 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvPosExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvPosExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.bvtype import hu.bme.mit.theta.core.model.Valuation @@ -25,30 +24,28 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("BvPos") -data class BvPosExpr( - override val op: Expr -) : PosExpr() { +data class BvPosExpr(override val op: Expr) : PosExpr() { - companion object { - private const val OPERATOR_LABEL = "bvpos" + companion object { + private const val OPERATOR_LABEL = "bvpos" - @JvmStatic - fun of(op: Expr) = BvPosExpr(op) + @JvmStatic fun of(op: Expr) = BvPosExpr(op) - @JvmStatic - fun create(op: Expr<*>) = BvPosExpr(TypeUtils.castBv(op)) - } + @JvmStatic fun create(op: Expr<*>) = BvPosExpr(TypeUtils.castBv(op)) + } - override val type: BvType get() = op.type + override val type: BvType + get() = op.type - override fun eval(`val`: Valuation): BvLitExpr { - val opVal = op.eval(`val`) as BvLitExpr - return opVal.pos() - } + override fun eval(`val`: Valuation): BvLitExpr { + val opVal = op.eval(`val`) as BvLitExpr + return opVal.pos() + } - override fun new(op: Expr): BvPosExpr = of(op) + override fun new(op: Expr): BvPosExpr = of(op) - override val operatorLabel: String get() = OPERATOR_LABEL + override val operatorLabel: String + get() = OPERATOR_LABEL - override fun toString(): String = super.toString() + override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvRotateLeftExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvRotateLeftExpr.kt index 2b68da5053..15e1e36e16 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvRotateLeftExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvRotateLeftExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.bvtype import hu.bme.mit.theta.core.model.Valuation @@ -25,33 +24,34 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("BvRotateLeft") -data class BvRotateLeftExpr( - override val leftOp: Expr, - override val rightOp: Expr -) : BinaryExpr() { +data class BvRotateLeftExpr(override val leftOp: Expr, override val rightOp: Expr) : + BinaryExpr() { - companion object { - private const val OPERATOR_LABEL = "bvrol" + companion object { + private const val OPERATOR_LABEL = "bvrol" - @JvmStatic - fun of(leftOp: Expr, rightOp: Expr) = BvRotateLeftExpr(leftOp, rightOp) + @JvmStatic + fun of(leftOp: Expr, rightOp: Expr) = BvRotateLeftExpr(leftOp, rightOp) - @JvmStatic - fun create(leftOp: Expr<*>, rightOp: Expr<*>) = BvRotateLeftExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) - } + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + BvRotateLeftExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) + } - override val type: BvType get() = leftOp.type + override val type: BvType + get() = leftOp.type - override fun eval(`val`: Valuation): BvLitExpr { - val leftOpVal = leftOp.eval(`val`) as BvLitExpr - val rightOpVal = rightOp.eval(`val`) as BvLitExpr - return leftOpVal.rotateLeft(rightOpVal) - } + override fun eval(`val`: Valuation): BvLitExpr { + val leftOpVal = leftOp.eval(`val`) as BvLitExpr + val rightOpVal = rightOp.eval(`val`) as BvLitExpr + return leftOpVal.rotateLeft(rightOpVal) + } - override fun new(leftOp: Expr, rightOp: Expr): BvRotateLeftExpr = of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): BvRotateLeftExpr = + of(leftOp, rightOp) - override val operatorLabel: String get() = OPERATOR_LABEL + override val operatorLabel: String + get() = OPERATOR_LABEL - override fun toString(): String = super.toString() + override fun toString(): String = super.toString() } - diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvRotateRightExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvRotateRightExpr.kt index e0bb825ec8..cc572e40c0 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvRotateRightExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvRotateRightExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.bvtype import hu.bme.mit.theta.core.model.Valuation @@ -26,32 +25,35 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("BvRotateRight") data class BvRotateRightExpr( - override val leftOp: Expr, - override val rightOp: Expr + override val leftOp: Expr, + override val rightOp: Expr, ) : BinaryExpr() { - companion object { - private const val OPERATOR_LABEL = "bvror" + companion object { + private const val OPERATOR_LABEL = "bvror" - @JvmStatic - fun of(leftOp: Expr, rightOp: Expr) = BvRotateRightExpr(leftOp, rightOp) + @JvmStatic + fun of(leftOp: Expr, rightOp: Expr) = BvRotateRightExpr(leftOp, rightOp) - @JvmStatic - fun create(leftOp: Expr<*>, rightOp: Expr<*>) = BvRotateRightExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) - } + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + BvRotateRightExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) + } - override val type: BvType get() = leftOp.type + override val type: BvType + get() = leftOp.type - override fun eval(`val`: Valuation): BvLitExpr { - val leftOpVal = leftOp.eval(`val`) as BvLitExpr - val rightOpVal = rightOp.eval(`val`) as BvLitExpr - return leftOpVal.rotateRight(rightOpVal) - } + override fun eval(`val`: Valuation): BvLitExpr { + val leftOpVal = leftOp.eval(`val`) as BvLitExpr + val rightOpVal = rightOp.eval(`val`) as BvLitExpr + return leftOpVal.rotateRight(rightOpVal) + } - override fun new(leftOp: Expr, rightOp: Expr): BvRotateRightExpr = of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): BvRotateRightExpr = + of(leftOp, rightOp) - override val operatorLabel: String get() = OPERATOR_LABEL + override val operatorLabel: String + get() = OPERATOR_LABEL - override fun toString(): String = super.toString() + override fun toString(): String = super.toString() } - diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSDivExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSDivExpr.kt index 2c568687da..285a155834 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSDivExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSDivExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.bvtype import hu.bme.mit.theta.core.model.Valuation @@ -25,25 +24,31 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("BvSDiv") -data class BvSDivExpr( - override val leftOp: Expr, - override val rightOp: Expr -) : DivExpr() { - companion object { - private const val OPERATOR_LABEL = "bvsdiv" - - @JvmStatic - fun of(leftOp: Expr, rightOp: Expr) = BvSDivExpr(leftOp, rightOp) - @JvmStatic - fun create(leftOp: Expr<*>, rightOp: Expr<*>) = BvSDivExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) - } - override val type: BvType get() = leftOp.type - override fun eval(`val`: Valuation): BvLitExpr { - val leftOpVal = leftOp.eval(`val`) as BvLitExpr - val rightOpVal = rightOp.eval(`val`) as BvLitExpr - return leftOpVal.sdiv(rightOpVal) - } - override fun new(leftOp: Expr, rightOp: Expr): BvSDivExpr = of(leftOp, rightOp) - override val operatorLabel: String get() = OPERATOR_LABEL - override fun toString(): String = super.toString() +data class BvSDivExpr(override val leftOp: Expr, override val rightOp: Expr) : + DivExpr() { + companion object { + private const val OPERATOR_LABEL = "bvsdiv" + + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = BvSDivExpr(leftOp, rightOp) + + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + BvSDivExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) + } + + override val type: BvType + get() = leftOp.type + + override fun eval(`val`: Valuation): BvLitExpr { + val leftOpVal = leftOp.eval(`val`) as BvLitExpr + val rightOpVal = rightOp.eval(`val`) as BvLitExpr + return leftOpVal.sdiv(rightOpVal) + } + + override fun new(leftOp: Expr, rightOp: Expr): BvSDivExpr = of(leftOp, rightOp) + + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSExtExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSExtExpr.kt index e099f5ab98..5e385da468 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSExtExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSExtExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.bvtype import hu.bme.mit.theta.common.Utils @@ -26,39 +25,31 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("BvSExt") -data class BvSExtExpr( - val op: Expr, - val extendType: BvType -) : Expr { +data class BvSExtExpr(val op: Expr, val extendType: BvType) : Expr { - companion object { + companion object { - private const val OPERATOR_LABEL = "bv_sign_extend" + private const val OPERATOR_LABEL = "bv_sign_extend" - @JvmStatic - fun of(op: Expr, extendType: BvType) = BvSExtExpr(op, extendType) + @JvmStatic fun of(op: Expr, extendType: BvType) = BvSExtExpr(op, extendType) - @JvmStatic - fun create(op: Expr<*>, extendType: BvType) = BvSExtExpr(castBv(op), extendType) - } + @JvmStatic fun create(op: Expr<*>, extendType: BvType) = BvSExtExpr(castBv(op), extendType) + } - override val arity: Int = 1 - override val type: BvType = extendType - override val ops: List> = listOf(op) - override fun eval(`val`: Valuation): LitExpr { - val bvLitExpr = op.eval(`val`) as BvLitExpr - return bvLitExpr.sext(extendType) - } + override val arity: Int = 1 + override val type: BvType = extendType + override val ops: List> = listOf(op) - override fun withOps(ops: List>): Expr { - require(ops.size == 1) - return of(castBv(ops[0]), extendType) - } + override fun eval(`val`: Valuation): LitExpr { + val bvLitExpr = op.eval(`val`) as BvLitExpr + return bvLitExpr.sext(extendType) + } - override fun toString(): String = Utils.lispStringBuilder(OPERATOR_LABEL) - .body() - .add(op) - .add(type) - .toString() -} + override fun withOps(ops: List>): Expr { + require(ops.size == 1) + return of(castBv(ops[0]), extendType) + } + override fun toString(): String = + Utils.lispStringBuilder(OPERATOR_LABEL).body().add(op).add(type).toString() +} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSGeqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSGeqExpr.kt index e111ae7b86..028ff556a5 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSGeqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSGeqExpr.kt @@ -13,14 +13,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.bvtype import hu.bme.mit.theta.core.model.Valuation import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.LitExpr import hu.bme.mit.theta.core.type.abstracttype.GeqExpr -import hu.bme.mit.theta.core.type.booltype.BoolExprs import hu.bme.mit.theta.core.type.booltype.BoolType import hu.bme.mit.theta.core.utils.TypeUtils import kotlinx.serialization.SerialName @@ -28,30 +26,30 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("BvSGeq") -data class BvSGeqExpr( - override val leftOp: Expr, - override val rightOp: Expr -) : GeqExpr() { +data class BvSGeqExpr(override val leftOp: Expr, override val rightOp: Expr) : + GeqExpr() { - companion object { + companion object { - private const val OPERATOR_LABEL = "bvsge" + private const val OPERATOR_LABEL = "bvsge" - @JvmStatic - fun of(leftOp: Expr, rightOp: Expr) = BvSGeqExpr(leftOp, rightOp) + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = BvSGeqExpr(leftOp, rightOp) - @JvmStatic - fun create(leftOp: Expr<*>, rightOp: Expr<*>) = BvSGeqExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) - } + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + BvSGeqExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) + } - override fun eval(`val`: Valuation): LitExpr { - val leftOpVal = leftOp.eval(`val`) as BvLitExpr - val rightOpVal = rightOp.eval(`val`) as BvLitExpr - return leftOpVal.sge(rightOpVal) - } + override fun eval(`val`: Valuation): LitExpr { + val leftOpVal = leftOp.eval(`val`) as BvLitExpr + val rightOpVal = rightOp.eval(`val`) as BvLitExpr + return leftOpVal.sge(rightOpVal) + } - override fun new(leftOp: Expr, rightOp: Expr): BvSGeqExpr = of(leftOp, rightOp) - override val operatorLabel: String get() = OPERATOR_LABEL - override fun toString(): String = super.toString() -} + override fun new(leftOp: Expr, rightOp: Expr): BvSGeqExpr = of(leftOp, rightOp) + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSGtExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSGtExpr.kt index 6e7b1c297f..9d7c8b3787 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSGtExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSGtExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.bvtype import hu.bme.mit.theta.core.model.Valuation @@ -27,30 +26,30 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("BvSGt") -data class BvSGtExpr( - override val leftOp: Expr, - override val rightOp: Expr -) : GtExpr() { +data class BvSGtExpr(override val leftOp: Expr, override val rightOp: Expr) : + GtExpr() { - companion object { + companion object { - private const val OPERATOR_LABEL = "bvsgt" + private const val OPERATOR_LABEL = "bvsgt" - @JvmStatic - fun of(leftOp: Expr, rightOp: Expr) = BvSGtExpr(leftOp, rightOp) + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = BvSGtExpr(leftOp, rightOp) - @JvmStatic - fun create(leftOp: Expr<*>, rightOp: Expr<*>) = BvSGtExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) - } + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + BvSGtExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) + } - override fun eval(`val`: Valuation): LitExpr { - val leftOpVal = leftOp.eval(`val`) as BvLitExpr - val rightOpVal = rightOp.eval(`val`) as BvLitExpr - return leftOpVal.sgt(rightOpVal) - } + override fun eval(`val`: Valuation): LitExpr { + val leftOpVal = leftOp.eval(`val`) as BvLitExpr + val rightOpVal = rightOp.eval(`val`) as BvLitExpr + return leftOpVal.sgt(rightOpVal) + } - override fun new(leftOp: Expr, rightOp: Expr): BvSGtExpr = of(leftOp, rightOp) - override val operatorLabel: String get() = OPERATOR_LABEL - override fun toString(): String = super.toString() -} + override fun new(leftOp: Expr, rightOp: Expr): BvSGtExpr = of(leftOp, rightOp) + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSLeqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSLeqExpr.kt index 8ef16e238e..dca7a7813c 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSLeqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSLeqExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.bvtype import hu.bme.mit.theta.core.model.Valuation @@ -27,30 +26,30 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("BvSLeq") -data class BvSLeqExpr( - override val leftOp: Expr, - override val rightOp: Expr -) : LeqExpr() { +data class BvSLeqExpr(override val leftOp: Expr, override val rightOp: Expr) : + LeqExpr() { - companion object { + companion object { - private const val OPERATOR_LABEL = "bvsle" + private const val OPERATOR_LABEL = "bvsle" - @JvmStatic - fun of(leftOp: Expr, rightOp: Expr) = BvSLeqExpr(leftOp, rightOp) + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = BvSLeqExpr(leftOp, rightOp) - @JvmStatic - fun create(leftOp: Expr<*>, rightOp: Expr<*>) = BvSLeqExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) - } + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + BvSLeqExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) + } - override fun eval(`val`: Valuation): LitExpr { - val leftOpVal = leftOp.eval(`val`) as BvLitExpr - val rightOpVal = rightOp.eval(`val`) as BvLitExpr - return leftOpVal.sle(rightOpVal) - } + override fun eval(`val`: Valuation): LitExpr { + val leftOpVal = leftOp.eval(`val`) as BvLitExpr + val rightOpVal = rightOp.eval(`val`) as BvLitExpr + return leftOpVal.sle(rightOpVal) + } - override fun new(leftOp: Expr, rightOp: Expr): BvSLeqExpr = of(leftOp, rightOp) - override val operatorLabel: String get() = OPERATOR_LABEL - override fun toString(): String = super.toString() -} + override fun new(leftOp: Expr, rightOp: Expr): BvSLeqExpr = of(leftOp, rightOp) + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSLtExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSLtExpr.kt index 0a04f0a8b3..33417c11d0 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSLtExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSLtExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.bvtype import hu.bme.mit.theta.core.model.Valuation @@ -27,30 +26,30 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("BvSLt") -data class BvSLtExpr( - override val leftOp: Expr, - override val rightOp: Expr -) : LtExpr() { +data class BvSLtExpr(override val leftOp: Expr, override val rightOp: Expr) : + LtExpr() { - companion object { + companion object { - private const val OPERATOR_LABEL = "bvslt" + private const val OPERATOR_LABEL = "bvslt" - @JvmStatic - fun of(leftOp: Expr, rightOp: Expr) = BvSLtExpr(leftOp, rightOp) + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = BvSLtExpr(leftOp, rightOp) - @JvmStatic - fun create(leftOp: Expr<*>, rightOp: Expr<*>) = BvSLtExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) - } + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + BvSLtExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) + } - override fun eval(`val`: Valuation): LitExpr { - val leftOpVal = leftOp.eval(`val`) as BvLitExpr - val rightOpVal = rightOp.eval(`val`) as BvLitExpr - return leftOpVal.slt(rightOpVal) - } + override fun eval(`val`: Valuation): LitExpr { + val leftOpVal = leftOp.eval(`val`) as BvLitExpr + val rightOpVal = rightOp.eval(`val`) as BvLitExpr + return leftOpVal.slt(rightOpVal) + } - override fun new(leftOp: Expr, rightOp: Expr): BvSLtExpr = of(leftOp, rightOp) - override val operatorLabel: String get() = OPERATOR_LABEL - override fun toString(): String = super.toString() -} + override fun new(leftOp: Expr, rightOp: Expr): BvSLtExpr = of(leftOp, rightOp) + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSModExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSModExpr.kt index c3604b3d14..6875d3b3b3 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSModExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSModExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.bvtype import hu.bme.mit.theta.core.model.Valuation @@ -25,25 +24,31 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("BvSMod") -data class BvSModExpr( - override val leftOp: Expr, - override val rightOp: Expr -) : ModExpr() { - companion object { - private const val OPERATOR_LABEL = "bvsmod" - - @JvmStatic - fun of(leftOp: Expr, rightOp: Expr) = BvSModExpr(leftOp, rightOp) - @JvmStatic - fun create(leftOp: Expr<*>, rightOp: Expr<*>) = BvSModExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) - } - override val type: BvType get() = leftOp.type - override fun eval(`val`: Valuation): BvLitExpr { - val leftOpVal = leftOp.eval(`val`) as BvLitExpr - val rightOpVal = rightOp.eval(`val`) as BvLitExpr - return leftOpVal.smod(rightOpVal) - } - override fun new(leftOp: Expr, rightOp: Expr): BvSModExpr = of(leftOp, rightOp) - override val operatorLabel: String get() = OPERATOR_LABEL - override fun toString(): String = super.toString() +data class BvSModExpr(override val leftOp: Expr, override val rightOp: Expr) : + ModExpr() { + companion object { + private const val OPERATOR_LABEL = "bvsmod" + + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = BvSModExpr(leftOp, rightOp) + + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + BvSModExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) + } + + override val type: BvType + get() = leftOp.type + + override fun eval(`val`: Valuation): BvLitExpr { + val leftOpVal = leftOp.eval(`val`) as BvLitExpr + val rightOpVal = rightOp.eval(`val`) as BvLitExpr + return leftOpVal.smod(rightOpVal) + } + + override fun new(leftOp: Expr, rightOp: Expr): BvSModExpr = of(leftOp, rightOp) + + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSRemExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSRemExpr.kt index f74c00d7b4..bc6e0dc6c9 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSRemExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSRemExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.bvtype import hu.bme.mit.theta.core.model.Valuation @@ -25,26 +24,31 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("BvSRem") -data class BvSRemExpr( - override val leftOp: Expr, - override val rightOp: Expr -) : RemExpr() { - companion object { - private const val OPERATOR_LABEL = "bvsrem" - - @JvmStatic - fun of(leftOp: Expr, rightOp: Expr) = BvSRemExpr(leftOp, rightOp) - @JvmStatic - fun create(leftOp: Expr<*>, rightOp: Expr<*>) = BvSRemExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) - } - override val type: BvType get() = leftOp.type - override fun eval(`val`: Valuation): BvLitExpr { - val leftOpVal = leftOp.eval(`val`) as BvLitExpr - val rightOpVal = rightOp.eval(`val`) as BvLitExpr - return leftOpVal.srem(rightOpVal) - } - override fun new(leftOp: Expr, rightOp: Expr): BvSRemExpr = of(leftOp, rightOp) - override val operatorLabel: String get() = OPERATOR_LABEL - override fun toString(): String = super.toString() -} +data class BvSRemExpr(override val leftOp: Expr, override val rightOp: Expr) : + RemExpr() { + companion object { + private const val OPERATOR_LABEL = "bvsrem" + + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = BvSRemExpr(leftOp, rightOp) + + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + BvSRemExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) + } + + override val type: BvType + get() = leftOp.type + override fun eval(`val`: Valuation): BvLitExpr { + val leftOpVal = leftOp.eval(`val`) as BvLitExpr + val rightOpVal = rightOp.eval(`val`) as BvLitExpr + return leftOpVal.srem(rightOpVal) + } + + override fun new(leftOp: Expr, rightOp: Expr): BvSRemExpr = of(leftOp, rightOp) + + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvShiftLeftExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvShiftLeftExpr.kt index d5089e24a7..c577affe85 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvShiftLeftExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvShiftLeftExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.bvtype import hu.bme.mit.theta.core.model.Valuation @@ -25,33 +24,34 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("BvShiftLeft") -data class BvShiftLeftExpr( - override val leftOp: Expr, - override val rightOp: Expr -) : BinaryExpr() { +data class BvShiftLeftExpr(override val leftOp: Expr, override val rightOp: Expr) : + BinaryExpr() { - companion object { - private const val OPERATOR_LABEL = "bvshl" + companion object { + private const val OPERATOR_LABEL = "bvshl" - @JvmStatic - fun of(leftOp: Expr, rightOp: Expr) = BvShiftLeftExpr(leftOp, rightOp) + @JvmStatic + fun of(leftOp: Expr, rightOp: Expr) = BvShiftLeftExpr(leftOp, rightOp) - @JvmStatic - fun create(leftOp: Expr<*>, rightOp: Expr<*>) = BvShiftLeftExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) - } + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + BvShiftLeftExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) + } - override val type: BvType get() = leftOp.type + override val type: BvType + get() = leftOp.type - override fun eval(`val`: Valuation): BvLitExpr { - val leftOpVal = leftOp.eval(`val`) as BvLitExpr - val rightOpVal = rightOp.eval(`val`) as BvLitExpr - return leftOpVal.shiftLeft(rightOpVal) - } + override fun eval(`val`: Valuation): BvLitExpr { + val leftOpVal = leftOp.eval(`val`) as BvLitExpr + val rightOpVal = rightOp.eval(`val`) as BvLitExpr + return leftOpVal.shiftLeft(rightOpVal) + } - override fun new(leftOp: Expr, rightOp: Expr): BvShiftLeftExpr = of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): BvShiftLeftExpr = + of(leftOp, rightOp) - override val operatorLabel: String get() = OPERATOR_LABEL + override val operatorLabel: String + get() = OPERATOR_LABEL - override fun toString(): String = super.toString() + override fun toString(): String = super.toString() } - diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSignChangeExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSignChangeExpr.kt index 9ca03ea1a7..d425b081ca 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSignChangeExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSignChangeExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.bvtype import hu.bme.mit.theta.core.model.Valuation @@ -25,30 +24,31 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("BvSignChange") -data class BvSignChangeExpr( - override val op: Expr, - val newType: BvType -) : PosExpr() { +data class BvSignChangeExpr(override val op: Expr, val newType: BvType) : + PosExpr() { - companion object { + companion object { - private const val OPERATOR_LABEL = "bvpos" + private const val OPERATOR_LABEL = "bvpos" - @JvmStatic - fun of(op: Expr, newType: BvType) = BvSignChangeExpr(op, newType) + @JvmStatic fun of(op: Expr, newType: BvType) = BvSignChangeExpr(op, newType) - @JvmStatic - fun create(op: Expr<*>, newType: BvType) = BvSignChangeExpr(TypeUtils.castBv(op), newType) - } + @JvmStatic + fun create(op: Expr<*>, newType: BvType) = BvSignChangeExpr(TypeUtils.castBv(op), newType) + } - override val type: BvType get() = newType - override fun eval(`val`: Valuation): BvLitExpr { - val opVal = op.eval(`val`) as BvLitExpr - return opVal.pos() - } + override val type: BvType + get() = newType - override fun new(op: Expr): BvSignChangeExpr = of(op, newType) - override val operatorLabel: String get() = OPERATOR_LABEL - override fun toString(): String = super.toString() -} + override fun eval(`val`: Valuation): BvLitExpr { + val opVal = op.eval(`val`) as BvLitExpr + return opVal.pos() + } + + override fun new(op: Expr): BvSignChangeExpr = of(op, newType) + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSubExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSubExpr.kt index ccf6c26821..229f9a1609 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSubExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSubExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.bvtype import hu.bme.mit.theta.core.model.Valuation @@ -25,32 +24,32 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("BvSub") -data class BvSubExpr( - override val leftOp: Expr, - override val rightOp: Expr -) : SubExpr() { +data class BvSubExpr(override val leftOp: Expr, override val rightOp: Expr) : + SubExpr() { - companion object { - private const val OPERATOR_LABEL = "bvsub" + companion object { + private const val OPERATOR_LABEL = "bvsub" - @JvmStatic - fun of(leftOp: Expr, rightOp: Expr) = BvSubExpr(leftOp, rightOp) + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = BvSubExpr(leftOp, rightOp) - @JvmStatic - fun create(leftOp: Expr<*>, rightOp: Expr<*>) = BvSubExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) - } + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + BvSubExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) + } - override val type: BvType get() = leftOp.type + override val type: BvType + get() = leftOp.type - override fun eval(`val`: Valuation): BvLitExpr { - val leftOpVal = leftOp.eval(`val`) as BvLitExpr - val rightOpVal = rightOp.eval(`val`) as BvLitExpr - return leftOpVal.sub(rightOpVal) - } + override fun eval(`val`: Valuation): BvLitExpr { + val leftOpVal = leftOp.eval(`val`) as BvLitExpr + val rightOpVal = rightOp.eval(`val`) as BvLitExpr + return leftOpVal.sub(rightOpVal) + } - override fun new(leftOp: Expr, rightOp: Expr): BvSubExpr = of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): BvSubExpr = of(leftOp, rightOp) - override val operatorLabel: String get() = OPERATOR_LABEL + override val operatorLabel: String + get() = OPERATOR_LABEL - override fun toString(): String = super.toString() + override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvType.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvType.kt index 9370b29139..6e85555743 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvType.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvType.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.bvtype import hu.bme.mit.theta.common.Utils @@ -24,89 +23,96 @@ import hu.bme.mit.theta.core.type.abstracttype.* import hu.bme.mit.theta.core.type.fptype.FpExprs.FromBv import hu.bme.mit.theta.core.type.fptype.FpRoundingMode.Companion.defaultRoundingMode import hu.bme.mit.theta.core.type.fptype.FpType +import java.math.BigInteger import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import java.math.BigInteger - @Serializable @SerialName(BvType.TYPE_LABEL) -data class BvType( - val size: Int, - val signed: Boolean?, -) : Additive, Multiplicative, Divisible, Equational, Ordered, Castable { +data class BvType(val size: Int, val signed: Boolean?) : + Additive, + Multiplicative, + Divisible, + Equational, + Ordered, + Castable { - init { - require(size > 0) { "Bitvector size must be positive" } - } + init { + require(size > 0) { "Bitvector size must be positive" } + } - companion object { + companion object { - internal const val TYPE_LABEL = "Bv" + internal const val TYPE_LABEL = "Bv" - @JvmStatic - fun of(size: Int): BvType = BvType(size, null) + @JvmStatic fun of(size: Int): BvType = BvType(size, null) - @JvmStatic - fun of(size: Int, signed: Boolean?): BvType = BvType(size, signed) - } + @JvmStatic fun of(size: Int, signed: Boolean?): BvType = BvType(size, signed) + } - fun withSize(size: Int): BvType = BvType(size, signed) - - fun isSigned(): Boolean = signed ?: error("Signedness is not specified") - - override fun Eq(leftOp: Expr, rightOp: Expr) = BvEqExpr(leftOp, rightOp) - override fun Neq(leftOp: Expr, rightOp: Expr) = BvNeqExpr(leftOp, rightOp) - override fun Add(ops: Iterable>) = BvExprs.Add(ops) - override fun Sub(leftOp: Expr, rightOp: Expr) = BvExprs.Sub(leftOp, rightOp) - override fun Pos(op: Expr) = BvExprs.Pos(op) - override fun Neg(op: Expr) = BvExprs.Neg(op) - override fun Cast(op: Expr, type: TargetType): Expr { - if (type is FpType && signed != null) { - @Suppress("UNCHECKED_CAST") - return FromBv(defaultRoundingMode, op, type as FpType, signed) as Expr - } - throw ClassCastException("Bv cannot be cast to $type") - } + fun withSize(size: Int): BvType = BvType(size, signed) - override fun Mod(leftOp: Expr, rightOp: Expr): ModExpr { - check(signed != null && signed) { "Signed BvType required for Mod" } - return BvExprs.SMod(leftOp, rightOp) - } + fun isSigned(): Boolean = signed ?: error("Signedness is not specified") - override fun Rem(leftOp: Expr, rightOp: Expr): RemExpr { - check(signed != null) { "Neutral BvType cannot be used here" } - return if (signed) BvExprs.SRem(leftOp, rightOp) else BvExprs.URem(leftOp, rightOp) - } + override fun Eq(leftOp: Expr, rightOp: Expr) = BvEqExpr(leftOp, rightOp) - override fun Mul(ops: Iterable>) = BvExprs.Mul(ops) - override fun Div(leftOp: Expr, rightOp: Expr): DivExpr { - check(signed != null) { "Neutral BvType cannot be used here" } - return if (signed) BvExprs.SDiv(leftOp, rightOp) else BvExprs.UDiv(leftOp, rightOp) - } - - override fun Lt(leftOp: Expr, rightOp: Expr): LtExpr { - check(signed != null) { "Neutral BvType cannot be used here" } - return if (signed) BvExprs.SLt(leftOp, rightOp) else BvExprs.ULt(leftOp, rightOp) - } + override fun Neq(leftOp: Expr, rightOp: Expr) = BvNeqExpr(leftOp, rightOp) - override fun Leq(leftOp: Expr, rightOp: Expr): LeqExpr { - check(signed != null) { "Neutral BvType cannot be used here" } - return if (signed) BvExprs.SLeq(leftOp, rightOp) else BvExprs.ULeq(leftOp, rightOp) - } + override fun Add(ops: Iterable>) = BvExprs.Add(ops) - override fun Gt(leftOp: Expr, rightOp: Expr): GtExpr { - check(signed != null) { "Neutral BvType cannot be used here" } - return if (signed) BvExprs.SGt(leftOp, rightOp) else BvExprs.UGt(leftOp, rightOp) - } + override fun Sub(leftOp: Expr, rightOp: Expr) = BvExprs.Sub(leftOp, rightOp) - override fun Geq(leftOp: Expr, rightOp: Expr): GeqExpr { - check(signed != null) { "Neutral BvType cannot be used here" } - return if (signed) BvExprs.SGeq(leftOp, rightOp) else BvExprs.UGeq(leftOp, rightOp) - } + override fun Pos(op: Expr) = BvExprs.Pos(op) - override val domainSize: DomainSize get() = DomainSize.of(BigInteger.TWO.pow(size)) + override fun Neg(op: Expr) = BvExprs.Neg(op) - override fun toString(): String = Utils.lispStringBuilder(TYPE_LABEL).add(size).toString() + override fun Cast(op: Expr, type: TargetType): Expr { + if (type is FpType && signed != null) { + @Suppress("UNCHECKED_CAST") + return FromBv(defaultRoundingMode, op, type as FpType, signed) as Expr + } + throw ClassCastException("Bv cannot be cast to $type") + } + + override fun Mod(leftOp: Expr, rightOp: Expr): ModExpr { + check(signed != null && signed) { "Signed BvType required for Mod" } + return BvExprs.SMod(leftOp, rightOp) + } + + override fun Rem(leftOp: Expr, rightOp: Expr): RemExpr { + check(signed != null) { "Neutral BvType cannot be used here" } + return if (signed) BvExprs.SRem(leftOp, rightOp) else BvExprs.URem(leftOp, rightOp) + } + + override fun Mul(ops: Iterable>) = BvExprs.Mul(ops) + + override fun Div(leftOp: Expr, rightOp: Expr): DivExpr { + check(signed != null) { "Neutral BvType cannot be used here" } + return if (signed) BvExprs.SDiv(leftOp, rightOp) else BvExprs.UDiv(leftOp, rightOp) + } + + override fun Lt(leftOp: Expr, rightOp: Expr): LtExpr { + check(signed != null) { "Neutral BvType cannot be used here" } + return if (signed) BvExprs.SLt(leftOp, rightOp) else BvExprs.ULt(leftOp, rightOp) + } + + override fun Leq(leftOp: Expr, rightOp: Expr): LeqExpr { + check(signed != null) { "Neutral BvType cannot be used here" } + return if (signed) BvExprs.SLeq(leftOp, rightOp) else BvExprs.ULeq(leftOp, rightOp) + } + + override fun Gt(leftOp: Expr, rightOp: Expr): GtExpr { + check(signed != null) { "Neutral BvType cannot be used here" } + return if (signed) BvExprs.SGt(leftOp, rightOp) else BvExprs.UGt(leftOp, rightOp) + } + + override fun Geq(leftOp: Expr, rightOp: Expr): GeqExpr { + check(signed != null) { "Neutral BvType cannot be used here" } + return if (signed) BvExprs.SGeq(leftOp, rightOp) else BvExprs.UGeq(leftOp, rightOp) + } + + override val domainSize: DomainSize + get() = DomainSize.of(BigInteger.TWO.pow(size)) + + override fun toString(): String = Utils.lispStringBuilder(TYPE_LABEL).add(size).toString() } - diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvUDivExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvUDivExpr.kt index 46965ec3af..e728d54900 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvUDivExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvUDivExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.bvtype import hu.bme.mit.theta.core.model.Valuation @@ -25,26 +24,31 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("BvUDiv") -data class BvUDivExpr( - override val leftOp: Expr, - override val rightOp: Expr -) : DivExpr() { - companion object { - private const val OPERATOR_LABEL = "bvudiv" - - @JvmStatic - fun of(leftOp: Expr, rightOp: Expr) = BvUDivExpr(leftOp, rightOp) - @JvmStatic - fun create(leftOp: Expr<*>, rightOp: Expr<*>) = BvUDivExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) - } - override val type: BvType get() = leftOp.type - override fun eval(`val`: Valuation): BvLitExpr { - val leftOpVal = leftOp.eval(`val`) as BvLitExpr - val rightOpVal = rightOp.eval(`val`) as BvLitExpr - return leftOpVal.udiv(rightOpVal) - } - override fun new(leftOp: Expr, rightOp: Expr): BvUDivExpr = of(leftOp, rightOp) - override val operatorLabel: String get() = OPERATOR_LABEL - override fun toString(): String = super.toString() -} +data class BvUDivExpr(override val leftOp: Expr, override val rightOp: Expr) : + DivExpr() { + companion object { + private const val OPERATOR_LABEL = "bvudiv" + + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = BvUDivExpr(leftOp, rightOp) + + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + BvUDivExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) + } + + override val type: BvType + get() = leftOp.type + override fun eval(`val`: Valuation): BvLitExpr { + val leftOpVal = leftOp.eval(`val`) as BvLitExpr + val rightOpVal = rightOp.eval(`val`) as BvLitExpr + return leftOpVal.udiv(rightOpVal) + } + + override fun new(leftOp: Expr, rightOp: Expr): BvUDivExpr = of(leftOp, rightOp) + + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvUGeqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvUGeqExpr.kt index c958d4a447..b670f06a9e 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvUGeqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvUGeqExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.bvtype import hu.bme.mit.theta.core.model.Valuation @@ -25,33 +24,32 @@ import hu.bme.mit.theta.core.utils.TypeUtils import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable - @Serializable @SerialName("BvUGeq") -data class BvUGeqExpr( - override val leftOp: Expr, - override val rightOp: Expr -) : GeqExpr() { +data class BvUGeqExpr(override val leftOp: Expr, override val rightOp: Expr) : + GeqExpr() { - companion object { + companion object { - private const val OPERATOR_LABEL = "bvuge" + private const val OPERATOR_LABEL = "bvuge" - @JvmStatic - fun of(leftOp: Expr, rightOp: Expr) = BvUGeqExpr(leftOp, rightOp) + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = BvUGeqExpr(leftOp, rightOp) - @JvmStatic - fun create(leftOp: Expr<*>, rightOp: Expr<*>) = BvUGeqExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) - } + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + BvUGeqExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) + } - override fun eval(`val`: Valuation): LitExpr { - val leftOpVal = leftOp.eval(`val`) as BvLitExpr - val rightOpVal = rightOp.eval(`val`) as BvLitExpr - return leftOpVal.uge(rightOpVal) - } + override fun eval(`val`: Valuation): LitExpr { + val leftOpVal = leftOp.eval(`val`) as BvLitExpr + val rightOpVal = rightOp.eval(`val`) as BvLitExpr + return leftOpVal.uge(rightOpVal) + } - override fun new(leftOp: Expr, rightOp: Expr): BvUGeqExpr = of(leftOp, rightOp) - override val operatorLabel: String get() = OPERATOR_LABEL - override fun toString(): String = super.toString() -} + override fun new(leftOp: Expr, rightOp: Expr): BvUGeqExpr = of(leftOp, rightOp) + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvUGtExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvUGtExpr.kt index 8febb5bebb..17a785743b 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvUGtExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvUGtExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.bvtype import hu.bme.mit.theta.core.model.Valuation @@ -27,30 +26,30 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("BvUGt") -data class BvUGtExpr( - override val leftOp: Expr, - override val rightOp: Expr -) : GtExpr() { +data class BvUGtExpr(override val leftOp: Expr, override val rightOp: Expr) : + GtExpr() { - companion object { + companion object { - private const val OPERATOR_LABEL = "bvugt" + private const val OPERATOR_LABEL = "bvugt" - @JvmStatic - fun of(leftOp: Expr, rightOp: Expr) = BvUGtExpr(leftOp, rightOp) + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = BvUGtExpr(leftOp, rightOp) - @JvmStatic - fun create(leftOp: Expr<*>, rightOp: Expr<*>) = BvUGtExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) - } + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + BvUGtExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) + } - override fun eval(`val`: Valuation): LitExpr { - val leftOpVal = leftOp.eval(`val`) as BvLitExpr - val rightOpVal = rightOp.eval(`val`) as BvLitExpr - return leftOpVal.ugt(rightOpVal) - } + override fun eval(`val`: Valuation): LitExpr { + val leftOpVal = leftOp.eval(`val`) as BvLitExpr + val rightOpVal = rightOp.eval(`val`) as BvLitExpr + return leftOpVal.ugt(rightOpVal) + } - override fun new(leftOp: Expr, rightOp: Expr): BvUGtExpr = of(leftOp, rightOp) - override val operatorLabel: String get() = OPERATOR_LABEL - override fun toString(): String = super.toString() -} + override fun new(leftOp: Expr, rightOp: Expr): BvUGtExpr = of(leftOp, rightOp) + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvULeqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvULeqExpr.kt index 77611fc06a..09479742ae 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvULeqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvULeqExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.bvtype import hu.bme.mit.theta.core.model.Valuation @@ -27,30 +26,30 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("BvULeq") -data class BvULeqExpr( - override val leftOp: Expr, - override val rightOp: Expr -) : LeqExpr() { +data class BvULeqExpr(override val leftOp: Expr, override val rightOp: Expr) : + LeqExpr() { - companion object { + companion object { - private const val OPERATOR_LABEL = "bvule" + private const val OPERATOR_LABEL = "bvule" - @JvmStatic - fun of(leftOp: Expr, rightOp: Expr) = BvULeqExpr(leftOp, rightOp) + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = BvULeqExpr(leftOp, rightOp) - @JvmStatic - fun create(leftOp: Expr<*>, rightOp: Expr<*>) = BvULeqExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) - } + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + BvULeqExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) + } - override fun eval(`val`: Valuation): LitExpr { - val leftOpVal = leftOp.eval(`val`) as BvLitExpr - val rightOpVal = rightOp.eval(`val`) as BvLitExpr - return leftOpVal.ule(rightOpVal) - } + override fun eval(`val`: Valuation): LitExpr { + val leftOpVal = leftOp.eval(`val`) as BvLitExpr + val rightOpVal = rightOp.eval(`val`) as BvLitExpr + return leftOpVal.ule(rightOpVal) + } - override fun new(leftOp: Expr, rightOp: Expr): BvULeqExpr = of(leftOp, rightOp) - override val operatorLabel: String get() = OPERATOR_LABEL - override fun toString(): String = super.toString() -} + override fun new(leftOp: Expr, rightOp: Expr): BvULeqExpr = of(leftOp, rightOp) + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvULtExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvULtExpr.kt index 191fb082ed..48fe70b169 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvULtExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvULtExpr.kt @@ -13,14 +13,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.bvtype import hu.bme.mit.theta.core.model.Valuation import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.LitExpr import hu.bme.mit.theta.core.type.abstracttype.LtExpr -import hu.bme.mit.theta.core.type.booltype.BoolExprs import hu.bme.mit.theta.core.type.booltype.BoolType import hu.bme.mit.theta.core.utils.TypeUtils import kotlinx.serialization.SerialName @@ -28,30 +26,30 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("BvULt") -data class BvULtExpr( - override val leftOp: Expr, - override val rightOp: Expr -) : LtExpr() { +data class BvULtExpr(override val leftOp: Expr, override val rightOp: Expr) : + LtExpr() { - companion object { + companion object { - private const val OPERATOR_LABEL = "bvult" + private const val OPERATOR_LABEL = "bvult" - @JvmStatic - fun of(leftOp: Expr, rightOp: Expr) = BvULtExpr(leftOp, rightOp) + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = BvULtExpr(leftOp, rightOp) - @JvmStatic - fun create(leftOp: Expr<*>, rightOp: Expr<*>) = BvULtExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) - } + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + BvULtExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) + } - override fun eval(`val`: Valuation): LitExpr { - val leftOpVal = leftOp.eval(`val`) as BvLitExpr - val rightOpVal = rightOp.eval(`val`) as BvLitExpr - return leftOpVal.ult(rightOpVal) - } + override fun eval(`val`: Valuation): LitExpr { + val leftOpVal = leftOp.eval(`val`) as BvLitExpr + val rightOpVal = rightOp.eval(`val`) as BvLitExpr + return leftOpVal.ult(rightOpVal) + } - override fun new(leftOp: Expr, rightOp: Expr): BvULtExpr = of(leftOp, rightOp) - override val operatorLabel: String get() = OPERATOR_LABEL - override fun toString(): String = super.toString() -} + override fun new(leftOp: Expr, rightOp: Expr): BvULtExpr = of(leftOp, rightOp) + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvURemExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvURemExpr.kt index 9cd6759d6d..b3d42440a7 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvURemExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvURemExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.bvtype import hu.bme.mit.theta.core.model.Valuation @@ -25,26 +24,31 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("BvURem") -data class BvURemExpr( - override val leftOp: Expr, - override val rightOp: Expr -) : RemExpr() { - companion object { - private const val OPERATOR_LABEL = "bvurem" - - @JvmStatic - fun of(leftOp: Expr, rightOp: Expr) = BvURemExpr(leftOp, rightOp) - @JvmStatic - fun create(leftOp: Expr<*>, rightOp: Expr<*>) = BvURemExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) - } - override val type: BvType get() = leftOp.type - override fun eval(`val`: Valuation): BvLitExpr { - val leftOpVal = leftOp.eval(`val`) as BvLitExpr - val rightOpVal = rightOp.eval(`val`) as BvLitExpr - return leftOpVal.urem(rightOpVal) - } - override fun new(leftOp: Expr, rightOp: Expr): BvURemExpr = of(leftOp, rightOp) - override val operatorLabel: String get() = OPERATOR_LABEL - override fun toString(): String = super.toString() -} +data class BvURemExpr(override val leftOp: Expr, override val rightOp: Expr) : + RemExpr() { + companion object { + private const val OPERATOR_LABEL = "bvurem" + + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = BvURemExpr(leftOp, rightOp) + + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + BvURemExpr(TypeUtils.castBv(leftOp), TypeUtils.castBv(rightOp)) + } + + override val type: BvType + get() = leftOp.type + override fun eval(`val`: Valuation): BvLitExpr { + val leftOpVal = leftOp.eval(`val`) as BvLitExpr + val rightOpVal = rightOp.eval(`val`) as BvLitExpr + return leftOpVal.urem(rightOpVal) + } + + override fun new(leftOp: Expr, rightOp: Expr): BvURemExpr = of(leftOp, rightOp) + + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvXorExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvXorExpr.kt index 5eb421fe5d..81ea44551e 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvXorExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvXorExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.bvtype import hu.bme.mit.theta.core.model.Valuation @@ -25,29 +24,28 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("BvXor") -data class BvXorExpr( - override val ops: List> -) : MultiaryExpr() { +data class BvXorExpr(override val ops: List>) : MultiaryExpr() { - companion object { - private const val OPERATOR_LABEL = "bvxor" + companion object { + private const val OPERATOR_LABEL = "bvxor" - @JvmStatic - fun of(ops: Iterable>) = BvXorExpr(ops.toList()) + @JvmStatic fun of(ops: Iterable>) = BvXorExpr(ops.toList()) - @JvmStatic - fun create(ops: List>) = BvXorExpr(ops.map { TypeUtils.castBv(it) }) - } + @JvmStatic fun create(ops: List>) = BvXorExpr(ops.map { TypeUtils.castBv(it) }) + } - override val type: BvType get() = ops[0].type + override val type: BvType + get() = ops[0].type - override fun eval(`val`: Valuation): BvLitExpr = ops.drop(1).fold(ops[0].eval(`val`) as BvLitExpr) { acc, op -> - acc.xor(op.eval(`val`) as BvLitExpr) + override fun eval(`val`: Valuation): BvLitExpr = + ops.drop(1).fold(ops[0].eval(`val`) as BvLitExpr) { acc, op -> + acc.xor(op.eval(`val`) as BvLitExpr) } - override fun new(ops: List>): BvXorExpr = of(ops) + override fun new(ops: List>): BvXorExpr = of(ops) - override val operatorLabel: String get() = OPERATOR_LABEL + override val operatorLabel: String + get() = OPERATOR_LABEL - override fun toString(): String = super.toString() + override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvZExtExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvZExtExpr.kt index e5e6898342..240665f81f 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvZExtExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvZExtExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.bvtype import hu.bme.mit.theta.common.Utils @@ -26,38 +25,32 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("BvZExt") -data class BvZExtExpr( - val op: Expr, - val extendType: BvType -) : Expr { - - companion object { - - private const val OPERATOR_LABEL = "bv_zero_extend" - - @JvmStatic - fun of(op: Expr, extendType: BvType) = BvZExtExpr(op, extendType) - - @JvmStatic - fun create(op: Expr<*>, extendType: BvType) = BvZExtExpr(TypeUtils.castBv(op), extendType) - } - - override val arity: Int = 1 - override val type: BvType = extendType - override val ops: List> = listOf(op) - override fun eval(`val`: Valuation): LitExpr { - val bvLitExpr = op.eval(`val`) as BvLitExpr - return bvLitExpr.zext(extendType) - } - - override fun withOps(ops: List>): Expr { - require(ops.size == 1) - return of(TypeUtils.castBv(ops[0]), extendType) - } - - override fun toString(): String = Utils.lispStringBuilder(OPERATOR_LABEL) - .body() - .add(op) - .add(type) - .toString() +data class BvZExtExpr(val op: Expr, val extendType: BvType) : Expr { + + companion object { + + private const val OPERATOR_LABEL = "bv_zero_extend" + + @JvmStatic fun of(op: Expr, extendType: BvType) = BvZExtExpr(op, extendType) + + @JvmStatic + fun create(op: Expr<*>, extendType: BvType) = BvZExtExpr(TypeUtils.castBv(op), extendType) + } + + override val arity: Int = 1 + override val type: BvType = extendType + override val ops: List> = listOf(op) + + override fun eval(`val`: Valuation): LitExpr { + val bvLitExpr = op.eval(`val`) as BvLitExpr + return bvLitExpr.zext(extendType) + } + + override fun withOps(ops: List>): Expr { + require(ops.size == 1) + return of(TypeUtils.castBv(ops[0]), extendType) + } + + override fun toString(): String = + Utils.lispStringBuilder(OPERATOR_LABEL).body().add(op).add(type).toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumEqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumEqExpr.kt index 3a34d3ca06..3a19225f0c 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumEqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumEqExpr.kt @@ -1,3 +1,18 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package hu.bme.mit.theta.core.type.enumtype import hu.bme.mit.theta.core.model.Valuation @@ -10,22 +25,19 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("EnumEqExpr") -data class EnumEqExpr( - override val leftOp: Expr, - override val rightOp: Expr -) : EqExpr() { +data class EnumEqExpr(override val leftOp: Expr, override val rightOp: Expr) : + EqExpr() { - companion object { + companion object { - @JvmStatic - fun of(leftOp: Expr, rightOp: Expr) = EnumEqExpr(leftOp, rightOp) - } + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = EnumEqExpr(leftOp, rightOp) + } - override fun eval(`val`: Valuation): LitExpr = - EnumLitExpr.eq(leftOp.eval(`val`) as EnumLitExpr, rightOp.eval(`val`) as EnumLitExpr) + override fun eval(`val`: Valuation): LitExpr = + EnumLitExpr.eq(leftOp.eval(`val`) as EnumLitExpr, rightOp.eval(`val`) as EnumLitExpr) - override fun new(leftOp: Expr, rightOp: Expr): EnumEqExpr = - of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): EnumEqExpr = + of(leftOp, rightOp) - override fun toString(): String = super.toString() + override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumLitExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumLitExpr.kt index 64a2690194..f7573aca1c 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumLitExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumLitExpr.kt @@ -1,3 +1,18 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package hu.bme.mit.theta.core.type.enumtype import hu.bme.mit.theta.core.model.Valuation @@ -10,29 +25,28 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("EnumLitExpr") -data class EnumLitExpr( - override val type: EnumType, - val value: String -) : NullaryExpr(), LitExpr { - - companion object { - - @JvmStatic - fun of(type: EnumType, literalName: String): EnumLitExpr { - val value = EnumType.getShortName(literalName) - require(value in type.values) { "Invalid value $value for type ${type.name}" } - return EnumLitExpr(type, value) - } - - @JvmStatic - fun eq(l: EnumLitExpr, r: EnumLitExpr): BoolLitExpr = - Bool(l.type == r.type && l.value == r.value) - - @JvmStatic - fun neq(l: EnumLitExpr, r: EnumLitExpr): BoolLitExpr = - Bool(l.type != r.type || l.value != r.value) +data class EnumLitExpr(override val type: EnumType, val value: String) : + NullaryExpr(), LitExpr { + + companion object { + + @JvmStatic + fun of(type: EnumType, literalName: String): EnumLitExpr { + val value = EnumType.getShortName(literalName) + require(value in type.values) { "Invalid value $value for type ${type.name}" } + return EnumLitExpr(type, value) } - override fun eval(`val`: Valuation): LitExpr = this - override fun toString(): String = EnumType.makeLongName(type, value) + @JvmStatic + fun eq(l: EnumLitExpr, r: EnumLitExpr): BoolLitExpr = + Bool(l.type == r.type && l.value == r.value) + + @JvmStatic + fun neq(l: EnumLitExpr, r: EnumLitExpr): BoolLitExpr = + Bool(l.type != r.type || l.value != r.value) + } + + override fun eval(`val`: Valuation): LitExpr = this + + override fun toString(): String = EnumType.makeLongName(type, value) } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumNeqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumNeqExpr.kt index 3e87e471cf..d974b27414 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumNeqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumNeqExpr.kt @@ -1,3 +1,18 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package hu.bme.mit.theta.core.type.enumtype import hu.bme.mit.theta.core.model.Valuation @@ -10,24 +25,24 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("EnumNeqExpr") -data class EnumNeqExpr( - override val leftOp: Expr, - override val rightOp: Expr -) : NeqExpr() { +data class EnumNeqExpr(override val leftOp: Expr, override val rightOp: Expr) : + NeqExpr() { - companion object { + companion object { - private const val OPERATOR_LABEL = "!=" - @JvmStatic - fun of(leftOp: Expr, rightOp: Expr) = EnumNeqExpr(leftOp, rightOp) - } + private const val OPERATOR_LABEL = "!=" - override val operatorLabel: String = OPERATOR_LABEL - override fun eval(`val`: Valuation): LitExpr = - EnumLitExpr.neq(leftOp.eval(`val`) as EnumLitExpr, rightOp.eval(`val`) as EnumLitExpr) + @JvmStatic + fun of(leftOp: Expr, rightOp: Expr) = EnumNeqExpr(leftOp, rightOp) + } - override fun new(leftOp: Expr, rightOp: Expr): EnumNeqExpr = - of(leftOp, rightOp) + override val operatorLabel: String = OPERATOR_LABEL - override fun toString(): String = super.toString() + override fun eval(`val`: Valuation): LitExpr = + EnumLitExpr.neq(leftOp.eval(`val`) as EnumLitExpr, rightOp.eval(`val`) as EnumLitExpr) + + override fun new(leftOp: Expr, rightOp: Expr): EnumNeqExpr = + of(leftOp, rightOp) + + override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumType.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumType.kt index c43c0b78e8..ba0433c99b 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumType.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumType.kt @@ -1,3 +1,18 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package hu.bme.mit.theta.core.type.enumtype import hu.bme.mit.theta.core.type.DomainSize @@ -13,63 +28,73 @@ import kotlinx.serialization.Serializable @Serializable @SerialName(EnumType.TYPE_LABEL) -data class EnumType( - val name: String, - private val literals: Map, -) : Equational, Type { - - companion object { - - internal const val TYPE_LABEL = "Enum" - const val FULLY_QUALIFIED_NAME_SEPARATOR = "." - @JvmStatic - fun of(name: String, values: Collection) = - EnumType(name, values.withIndex().associate { it.value to it.index }.toMap(LinkedHashMap())) - - @JvmStatic - fun makeLongName(typeName: String, literal: String) = "$typeName$FULLY_QUALIFIED_NAME_SEPARATOR$literal" - @JvmStatic - fun makeLongName(type: EnumType, literal: String) = makeLongName(type.name, literal) - @JvmStatic - fun getShortName(longName: String): String = - if (FULLY_QUALIFIED_NAME_SEPARATOR !in longName) longName - else longName.substring( - longName.indexOf(FULLY_QUALIFIED_NAME_SEPARATOR) + FULLY_QUALIFIED_NAME_SEPARATOR.length - ) - } +data class EnumType(val name: String, private val literals: Map) : + Equational, Type { + + companion object { + + internal const val TYPE_LABEL = "Enum" + const val FULLY_QUALIFIED_NAME_SEPARATOR = "." + + @JvmStatic + fun of(name: String, values: Collection) = + EnumType(name, values.withIndex().associate { it.value to it.index }.toMap(LinkedHashMap())) + + @JvmStatic + fun makeLongName(typeName: String, literal: String) = + "$typeName$FULLY_QUALIFIED_NAME_SEPARATOR$literal" + + @JvmStatic fun makeLongName(type: EnumType, literal: String) = makeLongName(type.name, literal) + + @JvmStatic + fun getShortName(longName: String): String = + if (FULLY_QUALIFIED_NAME_SEPARATOR !in longName) longName + else + longName.substring( + longName.indexOf(FULLY_QUALIFIED_NAME_SEPARATOR) + FULLY_QUALIFIED_NAME_SEPARATOR.length + ) + } + + override val domainSize: DomainSize + get() = DomainSize.of(literals.size.toLong()) - override val domainSize: DomainSize get() = DomainSize.of(literals.size.toLong()) - - override fun Eq(leftOp: Expr, rightOp: Expr): EqExpr = EnumEqExpr.of(leftOp, rightOp) - override fun Neq(leftOp: Expr, rightOp: Expr): NeqExpr = - EnumNeqExpr.of(leftOp, rightOp) - - val values: Set get() = literals.keys - val longValues: Set get() = literals.keys.map { makeLongName(this, it) }.toSet() - - fun getIntValue(literal: EnumLitExpr): Int = getIntValue(literal.value) - fun getIntValue(literal: String): Int = literals[literal] - ?: throw IllegalArgumentException("Enum type $name does not contain literal '$literal'") - - fun litFromShortName(shortName: String): LitExpr = - try { - EnumLitExpr.of(this, shortName) - } catch (e: Exception) { - throw RuntimeException("$shortName is not valid for type $name", e) - } - - fun litFromLongName(longName: String): LitExpr { - if (FULLY_QUALIFIED_NAME_SEPARATOR !in longName) - throw RuntimeException("$longName is an invalid enum longname") - val parts = longName.split(FULLY_QUALIFIED_NAME_SEPARATOR) - val type = parts[0] - require(name == type) { "$type does not belong to type $name" } - return litFromShortName(parts[1]) + override fun Eq(leftOp: Expr, rightOp: Expr): EqExpr = + EnumEqExpr.of(leftOp, rightOp) + + override fun Neq(leftOp: Expr, rightOp: Expr): NeqExpr = + EnumNeqExpr.of(leftOp, rightOp) + + val values: Set + get() = literals.keys + + val longValues: Set + get() = literals.keys.map { makeLongName(this, it) }.toSet() + + fun getIntValue(literal: EnumLitExpr): Int = getIntValue(literal.value) + + fun getIntValue(literal: String): Int = + literals[literal] + ?: throw IllegalArgumentException("Enum type $name does not contain literal '$literal'") + + fun litFromShortName(shortName: String): LitExpr = + try { + EnumLitExpr.of(this, shortName) + } catch (e: Exception) { + throw RuntimeException("$shortName is not valid for type $name", e) } - fun litFromIntValue(value: Int): LitExpr = - literals.entries.find { it.value == value }?.let { EnumLitExpr.of(this, it.key) } - ?: InvalidLitExpr(this) + fun litFromLongName(longName: String): LitExpr { + if (FULLY_QUALIFIED_NAME_SEPARATOR !in longName) + throw RuntimeException("$longName is an invalid enum longname") + val parts = longName.split(FULLY_QUALIFIED_NAME_SEPARATOR) + val type = parts[0] + require(name == type) { "$type does not belong to type $name" } + return litFromShortName(parts[1]) + } + + fun litFromIntValue(value: Int): LitExpr = + literals.entries.find { it.value == value }?.let { EnumLitExpr.of(this, it.key) } + ?: InvalidLitExpr(this) - override fun toString(): String = "EnumType{$name}" + override fun toString(): String = "EnumType{$name}" } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpAbsExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpAbsExpr.kt index 508ad170c5..fa911fb7da 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpAbsExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpAbsExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.fptype import hu.bme.mit.theta.core.model.Valuation @@ -25,34 +24,31 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("FpAbs") -data class FpAbsExpr( - override val op: Expr -) : UnaryExpr() { - companion object { - private const val OPERATOR_LABEL = "fpabs" +data class FpAbsExpr(override val op: Expr) : UnaryExpr() { + companion object { + private const val OPERATOR_LABEL = "fpabs" - @JvmStatic - fun of(op: Expr) = FpAbsExpr(op) + @JvmStatic fun of(op: Expr) = FpAbsExpr(op) - @JvmStatic - fun create(op: Expr<*>) = FpAbsExpr(castFp(op)) - } + @JvmStatic fun create(op: Expr<*>) = FpAbsExpr(castFp(op)) + } - override val type: FpType get() = op.type + override val type: FpType + get() = op.type - override fun eval(`val`: Valuation): FpLitExpr { - val opVal = op.eval(`val`) as FpLitExpr - return if (opVal.hidden) { - opVal.neg() - } else { - opVal - } + override fun eval(`val`: Valuation): FpLitExpr { + val opVal = op.eval(`val`) as FpLitExpr + return if (opVal.hidden) { + opVal.neg() + } else { + opVal } + } - override fun new(op: Expr): FpAbsExpr = of(op) + override fun new(op: Expr): FpAbsExpr = of(op) - override val operatorLabel: String get() = OPERATOR_LABEL + override val operatorLabel: String + get() = OPERATOR_LABEL - override fun toString(): String = super.toString() + override fun toString(): String = super.toString() } - diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpAddExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpAddExpr.kt index 6fec5833b2..5ec84ef1e0 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpAddExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpAddExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.fptype import hu.bme.mit.theta.core.model.Valuation @@ -26,38 +25,37 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("FpAdd") -data class FpAddExpr( - val roundingMode: FpRoundingMode, - override val ops: List> -) : AddExpr() { +data class FpAddExpr(val roundingMode: FpRoundingMode, override val ops: List>) : + AddExpr() { - init { - checkAllTypesEqual(ops) - } + init { + checkAllTypesEqual(ops) + } - companion object { - private const val OPERATOR_LABEL = "fpadd" + companion object { + private const val OPERATOR_LABEL = "fpadd" - @JvmStatic - fun of(roundingMode: FpRoundingMode, ops: Iterable>) = - FpAddExpr(roundingMode, ops.toList()) + @JvmStatic + fun of(roundingMode: FpRoundingMode, ops: Iterable>) = + FpAddExpr(roundingMode, ops.toList()) - @JvmStatic - fun create(roundingMode: FpRoundingMode, ops: List>) = - FpAddExpr(roundingMode, ops.map { castFp(it) }) - } + @JvmStatic + fun create(roundingMode: FpRoundingMode, ops: List>) = + FpAddExpr(roundingMode, ops.map { castFp(it) }) + } - override val type: FpType get() = ops[0].type + override val type: FpType + get() = ops[0].type - override fun eval(`val`: Valuation): FpLitExpr = - ops.drop(1).fold(ops[0].eval(`val`) as FpLitExpr) { acc, op -> - acc.add(roundingMode, op.eval(`val`) as FpLitExpr) - } + override fun eval(`val`: Valuation): FpLitExpr = + ops.drop(1).fold(ops[0].eval(`val`) as FpLitExpr) { acc, op -> + acc.add(roundingMode, op.eval(`val`) as FpLitExpr) + } - override fun new(ops: List>): FpAddExpr = of(roundingMode, ops) + override fun new(ops: List>): FpAddExpr = of(roundingMode, ops) - override val operatorLabel: String get() = OPERATOR_LABEL + override val operatorLabel: String + get() = OPERATOR_LABEL - override fun toString(): String = super.toString() + override fun toString(): String = super.toString() } - diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpAssignExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpAssignExpr.kt index d471539568..654d772b09 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpAssignExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpAssignExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.fptype import hu.bme.mit.theta.core.model.Valuation @@ -27,35 +26,28 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("FpAssign") -data class FpAssignExpr( - override val leftOp: Expr, - override val rightOp: Expr -) : EqExpr() { +data class FpAssignExpr(override val leftOp: Expr, override val rightOp: Expr) : + EqExpr() { - init { - checkAllTypesEqual(leftOp, rightOp) - } + init { + checkAllTypesEqual(leftOp, rightOp) + } - companion object { + companion object { - @JvmStatic - fun of(leftOp: Expr, rightOp: Expr) = - FpAssignExpr(leftOp, rightOp) + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = FpAssignExpr(leftOp, rightOp) - @JvmStatic - fun create(leftOp: Expr<*>, rightOp: Expr<*>) = - FpAssignExpr(castFp(leftOp), castFp(rightOp)) - } + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = FpAssignExpr(castFp(leftOp), castFp(rightOp)) + } - override fun eval(`val`: Valuation): BoolLitExpr { - val leftOpVal = leftOp.eval(`val`) as FpLitExpr - val rightOpVal = rightOp.eval(`val`) as FpLitExpr - return leftOpVal.assign(rightOpVal) - } + override fun eval(`val`: Valuation): BoolLitExpr { + val leftOpVal = leftOp.eval(`val`) as FpLitExpr + val rightOpVal = rightOp.eval(`val`) as FpLitExpr + return leftOpVal.assign(rightOpVal) + } - override fun new(leftOp: Expr, rightOp: Expr): FpAssignExpr = - of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): FpAssignExpr = of(leftOp, rightOp) - override fun toString(): String = super.toString() + override fun toString(): String = super.toString() } - diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpDivExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpDivExpr.kt index 3672a1f2f6..3d53f74dec 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpDivExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpDivExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.fptype import hu.bme.mit.theta.core.model.Valuation @@ -27,38 +26,40 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("FpDiv") data class FpDivExpr( - val roundingMode: FpRoundingMode, - override val leftOp: Expr, - override val rightOp: Expr + val roundingMode: FpRoundingMode, + override val leftOp: Expr, + override val rightOp: Expr, ) : DivExpr() { - init { - checkAllTypesEqual(leftOp, rightOp) - } + init { + checkAllTypesEqual(leftOp, rightOp) + } - companion object { - private const val OPERATOR_LABEL = "fpdiv" + companion object { + private const val OPERATOR_LABEL = "fpdiv" - @JvmStatic - fun of(roundingMode: FpRoundingMode, leftOp: Expr, rightOp: Expr) = - FpDivExpr(roundingMode, leftOp, rightOp) + @JvmStatic + fun of(roundingMode: FpRoundingMode, leftOp: Expr, rightOp: Expr) = + FpDivExpr(roundingMode, leftOp, rightOp) - @JvmStatic - fun create(roundingMode: FpRoundingMode, leftOp: Expr<*>, rightOp: Expr<*>) = - FpDivExpr(roundingMode, castFp(leftOp), castFp(rightOp)) - } + @JvmStatic + fun create(roundingMode: FpRoundingMode, leftOp: Expr<*>, rightOp: Expr<*>) = + FpDivExpr(roundingMode, castFp(leftOp), castFp(rightOp)) + } - override val type: FpType get() = leftOp.type + override val type: FpType + get() = leftOp.type - override fun eval(`val`: Valuation): FpLitExpr { - val leftOpVal = leftOp.eval(`val`) as FpLitExpr - val rightOpVal = rightOp.eval(`val`) as FpLitExpr - return leftOpVal.div(roundingMode, rightOpVal) - } + override fun eval(`val`: Valuation): FpLitExpr { + val leftOpVal = leftOp.eval(`val`) as FpLitExpr + val rightOpVal = rightOp.eval(`val`) as FpLitExpr + return leftOpVal.div(roundingMode, rightOpVal) + } - override fun new(leftOp: Expr, rightOp: Expr): FpDivExpr = - of(roundingMode, leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): FpDivExpr = + of(roundingMode, leftOp, rightOp) - override val operatorLabel: String get() = OPERATOR_LABEL + override val operatorLabel: String + get() = OPERATOR_LABEL - override fun toString(): String = super.toString() + override fun toString(): String = super.toString() } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpEqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpEqExpr.kt index cf2d1bd53e..8808f74c32 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpEqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpEqExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.fptype import hu.bme.mit.theta.core.model.Valuation @@ -27,34 +26,27 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("FpEq") -data class FpEqExpr( - override val leftOp: Expr, - override val rightOp: Expr -) : EqExpr() { - init { - checkAllTypesEqual(leftOp, rightOp) - } - - companion object { - - @JvmStatic - fun of(leftOp: Expr, rightOp: Expr) = - FpEqExpr(leftOp, rightOp) - - @JvmStatic - fun create(leftOp: Expr<*>, rightOp: Expr<*>) = - FpEqExpr(castFp(leftOp), castFp(rightOp)) - } - - override fun eval(`val`: Valuation): BoolLitExpr { - val leftOpVal = leftOp.eval(`val`) as FpLitExpr - val rightOpVal = rightOp.eval(`val`) as FpLitExpr - return leftOpVal.eq(rightOpVal) - } - - override fun new(leftOp: Expr, rightOp: Expr): FpEqExpr = - of(leftOp, rightOp) - - override fun toString(): String = super.toString() -} +data class FpEqExpr(override val leftOp: Expr, override val rightOp: Expr) : + EqExpr() { + init { + checkAllTypesEqual(leftOp, rightOp) + } + + companion object { + + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = FpEqExpr(leftOp, rightOp) + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = FpEqExpr(castFp(leftOp), castFp(rightOp)) + } + + override fun eval(`val`: Valuation): BoolLitExpr { + val leftOpVal = leftOp.eval(`val`) as FpLitExpr + val rightOpVal = rightOp.eval(`val`) as FpLitExpr + return leftOpVal.eq(rightOpVal) + } + + override fun new(leftOp: Expr, rightOp: Expr): FpEqExpr = of(leftOp, rightOp) + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpExprs.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpExprs.kt index 269e3ca636..04cf731962 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpExprs.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpExprs.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.fptype import hu.bme.mit.theta.core.type.Expr @@ -23,122 +22,109 @@ import hu.bme.mit.theta.core.type.bvtype.BvType @Suppress("FunctionName") object FpExprs { - @JvmStatic - fun FpType(exponent: Int, significand: Int) = FpType.of(exponent, significand) + @JvmStatic fun FpType(exponent: Int, significand: Int) = FpType.of(exponent, significand) - @JvmStatic - fun Fp(hidden: Boolean, exponent: BvLitExpr, significand: BvLitExpr) = FpLitExpr(hidden, exponent, significand) + @JvmStatic + fun Fp(hidden: Boolean, exponent: BvLitExpr, significand: BvLitExpr) = + FpLitExpr(hidden, exponent, significand) - @JvmStatic - fun NaN(fpType: FpType): FpLitExpr { - val exponent = BooleanArray(fpType.exponent) { true } - val significand = BooleanArray(fpType.significand - 1) { true } - return Fp(false, BvLitExpr.of(exponent), BvLitExpr.of(significand)) - } + @JvmStatic + fun NaN(fpType: FpType): FpLitExpr { + val exponent = BooleanArray(fpType.exponent) { true } + val significand = BooleanArray(fpType.significand - 1) { true } + return Fp(false, BvLitExpr.of(exponent), BvLitExpr.of(significand)) + } - @JvmStatic - fun PositiveInfinity(fpType: FpType): FpLitExpr { - val exponent = BooleanArray(fpType.exponent) { true } - val significand = BooleanArray(fpType.significand - 1) { false } - return Fp(false, BvLitExpr.of(exponent), BvLitExpr.of(significand)) - } + @JvmStatic + fun PositiveInfinity(fpType: FpType): FpLitExpr { + val exponent = BooleanArray(fpType.exponent) { true } + val significand = BooleanArray(fpType.significand - 1) { false } + return Fp(false, BvLitExpr.of(exponent), BvLitExpr.of(significand)) + } - @JvmStatic - fun NegativeInfinity(fpType: FpType): FpLitExpr { - val exponent = BooleanArray(fpType.exponent) { true } - val significand = BooleanArray(fpType.significand - 1) { false } - return Fp(true, BvLitExpr.of(exponent), BvLitExpr.of(significand)) - } + @JvmStatic + fun NegativeInfinity(fpType: FpType): FpLitExpr { + val exponent = BooleanArray(fpType.exponent) { true } + val significand = BooleanArray(fpType.significand - 1) { false } + return Fp(true, BvLitExpr.of(exponent), BvLitExpr.of(significand)) + } - @JvmStatic - fun PositiveZero(fpType: FpType): FpLitExpr { - val exponent = BooleanArray(fpType.exponent) { false } - val significand = BooleanArray(fpType.significand - 1) { false } - return Fp(false, BvLitExpr.of(exponent), BvLitExpr.of(significand)) - } + @JvmStatic + fun PositiveZero(fpType: FpType): FpLitExpr { + val exponent = BooleanArray(fpType.exponent) { false } + val significand = BooleanArray(fpType.significand - 1) { false } + return Fp(false, BvLitExpr.of(exponent), BvLitExpr.of(significand)) + } - @JvmStatic - fun NegativeZero(fpType: FpType): FpLitExpr { - val exponent = BooleanArray(fpType.exponent) { false } - val significand = BooleanArray(fpType.significand - 1) { false } - return Fp(true, BvLitExpr.of(exponent), BvLitExpr.of(significand)) - } + @JvmStatic + fun NegativeZero(fpType: FpType): FpLitExpr { + val exponent = BooleanArray(fpType.exponent) { false } + val significand = BooleanArray(fpType.significand - 1) { false } + return Fp(true, BvLitExpr.of(exponent), BvLitExpr.of(significand)) + } - @JvmStatic - fun Add(roundingMode: FpRoundingMode, ops: Iterable>) = FpAddExpr.of(roundingMode, ops) + @JvmStatic + fun Add(roundingMode: FpRoundingMode, ops: Iterable>) = + FpAddExpr.of(roundingMode, ops) - @JvmStatic - fun Sub(roundingMode: FpRoundingMode, leftOp: Expr, rightOp: Expr) = - FpSubExpr(roundingMode, leftOp, rightOp) + @JvmStatic + fun Sub(roundingMode: FpRoundingMode, leftOp: Expr, rightOp: Expr) = + FpSubExpr(roundingMode, leftOp, rightOp) - @JvmStatic - fun Pos(op: Expr) = FpPosExpr(op) + @JvmStatic fun Pos(op: Expr) = FpPosExpr(op) - @JvmStatic - fun Neg(op: Expr) = FpNegExpr(op) + @JvmStatic fun Neg(op: Expr) = FpNegExpr(op) - @JvmStatic - fun Mul(roundingMode: FpRoundingMode, ops: Iterable>) = FpMulExpr.of(roundingMode, ops) + @JvmStatic + fun Mul(roundingMode: FpRoundingMode, ops: Iterable>) = + FpMulExpr.of(roundingMode, ops) - @JvmStatic - fun Div(roundingMode: FpRoundingMode, leftOp: Expr, rightOp: Expr) = - FpDivExpr(roundingMode, leftOp, rightOp) + @JvmStatic + fun Div(roundingMode: FpRoundingMode, leftOp: Expr, rightOp: Expr) = + FpDivExpr(roundingMode, leftOp, rightOp) - @JvmStatic - fun Rem(leftOp: Expr, rightOp: Expr) = FpRemExpr(leftOp, rightOp) + @JvmStatic fun Rem(leftOp: Expr, rightOp: Expr) = FpRemExpr(leftOp, rightOp) - @JvmStatic - fun Abs(op: Expr) = FpAbsExpr(op) + @JvmStatic fun Abs(op: Expr) = FpAbsExpr(op) - @JvmStatic - fun FromBv(roundingMode: FpRoundingMode, op: Expr, fpType: FpType, signed: Boolean) = - FpFromBvExpr(roundingMode, op, fpType, signed) + @JvmStatic + fun FromBv(roundingMode: FpRoundingMode, op: Expr, fpType: FpType, signed: Boolean) = + FpFromBvExpr(roundingMode, op, fpType, signed) - @JvmStatic - fun Eq(leftOp: Expr, rightOp: Expr) = FpEqExpr(leftOp, rightOp) + @JvmStatic fun Eq(leftOp: Expr, rightOp: Expr) = FpEqExpr(leftOp, rightOp) - @JvmStatic - fun FpAssign(leftOp: Expr, rightOp: Expr) = FpAssignExpr(leftOp, rightOp) + @JvmStatic + fun FpAssign(leftOp: Expr, rightOp: Expr) = FpAssignExpr(leftOp, rightOp) - @JvmStatic - fun Neq(leftOp: Expr, rightOp: Expr) = FpNeqExpr(leftOp, rightOp) + @JvmStatic fun Neq(leftOp: Expr, rightOp: Expr) = FpNeqExpr(leftOp, rightOp) - @JvmStatic - fun Gt(leftOp: Expr, rightOp: Expr) = FpGtExpr(leftOp, rightOp) + @JvmStatic fun Gt(leftOp: Expr, rightOp: Expr) = FpGtExpr(leftOp, rightOp) - @JvmStatic - fun Geq(leftOp: Expr, rightOp: Expr) = FpGeqExpr(leftOp, rightOp) + @JvmStatic fun Geq(leftOp: Expr, rightOp: Expr) = FpGeqExpr(leftOp, rightOp) - @JvmStatic - fun Lt(leftOp: Expr, rightOp: Expr) = FpLtExpr(leftOp, rightOp) + @JvmStatic fun Lt(leftOp: Expr, rightOp: Expr) = FpLtExpr(leftOp, rightOp) - @JvmStatic - fun Leq(leftOp: Expr, rightOp: Expr) = FpLeqExpr(leftOp, rightOp) + @JvmStatic fun Leq(leftOp: Expr, rightOp: Expr) = FpLeqExpr(leftOp, rightOp) - @JvmStatic - fun IsNan(op: Expr) = FpIsNanExpr(op) + @JvmStatic fun IsNan(op: Expr) = FpIsNanExpr(op) - @JvmStatic - fun IsInfinite(op: Expr) = FpIsInfiniteExpr(op) + @JvmStatic fun IsInfinite(op: Expr) = FpIsInfiniteExpr(op) - @JvmStatic - fun RoundToIntegral(roundingMode: FpRoundingMode, op: Expr) = FpRoundToIntegralExpr(roundingMode, op) + @JvmStatic + fun RoundToIntegral(roundingMode: FpRoundingMode, op: Expr) = + FpRoundToIntegralExpr(roundingMode, op) - @JvmStatic - fun Sqrt(roundingMode: FpRoundingMode, op: Expr) = FpSqrtExpr(roundingMode, op) + @JvmStatic fun Sqrt(roundingMode: FpRoundingMode, op: Expr) = FpSqrtExpr(roundingMode, op) - @JvmStatic - fun Max(leftOp: Expr, rightOp: Expr) = FpMaxExpr(leftOp, rightOp) + @JvmStatic fun Max(leftOp: Expr, rightOp: Expr) = FpMaxExpr(leftOp, rightOp) - @JvmStatic - fun Min(leftOp: Expr, rightOp: Expr) = FpMinExpr(leftOp, rightOp) + @JvmStatic fun Min(leftOp: Expr, rightOp: Expr) = FpMinExpr(leftOp, rightOp) - @JvmStatic - fun ToBv(roundingMode: FpRoundingMode, op: Expr, size: Int, sgn: Boolean) = - FpToBvExpr(roundingMode, op, size, sgn) + @JvmStatic + fun ToBv(roundingMode: FpRoundingMode, op: Expr, size: Int, sgn: Boolean) = + FpToBvExpr(roundingMode, op, size, sgn) - @JvmStatic - fun ToFp(roundingMode: FpRoundingMode, op: Expr, exp: Int, sig: Int) = - FpToFpExpr(roundingMode, op, exp, sig) + @JvmStatic + fun ToFp(roundingMode: FpRoundingMode, op: Expr, exp: Int, sig: Int) = + FpToFpExpr(roundingMode, op, exp, sig) } - diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpFromBvExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpFromBvExpr.kt index d2c9cc57b7..a345c93d18 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpFromBvExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpFromBvExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.fptype import hu.bme.mit.theta.core.model.Valuation @@ -30,57 +29,58 @@ import org.kframework.mpfr.BigFloat @Serializable @SerialName("FpFromBv") data class FpFromBvExpr( - val roundingMode: FpRoundingMode, - override val op: Expr, - val fpType: FpType, - val signed: Boolean + val roundingMode: FpRoundingMode, + override val op: Expr, + val fpType: FpType, + val signed: Boolean, ) : UnaryExpr() { - companion object { + companion object { - private const val OPERATOR_LABEL = "fpfrombv" + private const val OPERATOR_LABEL = "fpfrombv" - @JvmStatic - fun of(roundingMode: FpRoundingMode, op: Expr, fpType: FpType, signed: Boolean) = - FpFromBvExpr(roundingMode, op, fpType, signed) + @JvmStatic + fun of(roundingMode: FpRoundingMode, op: Expr, fpType: FpType, signed: Boolean) = + FpFromBvExpr(roundingMode, op, fpType, signed) - @JvmStatic - fun create(roundingMode: FpRoundingMode, op: Expr, fpType: FpType, signed: Boolean): FpFromBvExpr = - of(roundingMode, op, fpType, signed) - } + @JvmStatic + fun create( + roundingMode: FpRoundingMode, + op: Expr, + fpType: FpType, + signed: Boolean, + ): FpFromBvExpr = of(roundingMode, op, fpType, signed) + } - override val type: FpType get() = fpType + override val type: FpType + get() = fpType - fun isSigned(): Boolean = signed + fun isSigned(): Boolean = signed - override fun eval(`val`: Valuation): FpLitExpr { - val mathContext = FpUtils.getMathContext(fpType, roundingMode) - val eval = op.eval(`val`) as BvLitExpr - return FpUtils.bigFloatToFpLitExpr( - BigFloat( - if (signed) - BvUtils.signedBvLitExprToBigInteger(eval) - else - BvUtils.unsignedBvLitExprToBigInteger(eval), - mathContext - ), - fpType - ) - } + override fun eval(`val`: Valuation): FpLitExpr { + val mathContext = FpUtils.getMathContext(fpType, roundingMode) + val eval = op.eval(`val`) as BvLitExpr + return FpUtils.bigFloatToFpLitExpr( + BigFloat( + if (signed) BvUtils.signedBvLitExprToBigInteger(eval) + else BvUtils.unsignedBvLitExprToBigInteger(eval), + mathContext, + ), + fpType, + ) + } - override fun new(op: Expr): FpFromBvExpr = - of(roundingMode, op, fpType, signed) + override fun new(op: Expr): FpFromBvExpr = of(roundingMode, op, fpType, signed) - override val operatorLabel: String = - (OPERATOR_LABEL - + "[" - + fpType.exponent - + "," - + fpType.significand - + "][" - + (if (signed) "s" else "u") - + "]") + override val operatorLabel: String = + (OPERATOR_LABEL + + "[" + + fpType.exponent + + "," + + fpType.significand + + "][" + + (if (signed) "s" else "u") + + "]") - override fun toString(): String = super.toString() + override fun toString(): String = super.toString() } - diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpGeqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpGeqExpr.kt index 883088df14..969a796e8e 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpGeqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpGeqExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.fptype import hu.bme.mit.theta.core.model.Valuation @@ -27,34 +26,27 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("FpGeq") -data class FpGeqExpr( - override val leftOp: Expr, - override val rightOp: Expr -) : GeqExpr() { - init { - checkAllTypesEqual(leftOp, rightOp) - } - - companion object { - - @JvmStatic - fun of(leftOp: Expr, rightOp: Expr) = - FpGeqExpr(leftOp, rightOp) - - @JvmStatic - fun create(leftOp: Expr<*>, rightOp: Expr<*>) = - FpGeqExpr(castFp(leftOp), castFp(rightOp)) - } - - override fun eval(`val`: Valuation): BoolLitExpr { - val leftOpVal = leftOp.eval(`val`) as FpLitExpr - val rightOpVal = rightOp.eval(`val`) as FpLitExpr - return leftOpVal.geq(rightOpVal) - } - - override fun new(leftOp: Expr, rightOp: Expr): FpGeqExpr = - of(leftOp, rightOp) - - override fun toString(): String = super.toString() -} +data class FpGeqExpr(override val leftOp: Expr, override val rightOp: Expr) : + GeqExpr() { + init { + checkAllTypesEqual(leftOp, rightOp) + } + + companion object { + + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = FpGeqExpr(leftOp, rightOp) + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = FpGeqExpr(castFp(leftOp), castFp(rightOp)) + } + + override fun eval(`val`: Valuation): BoolLitExpr { + val leftOpVal = leftOp.eval(`val`) as FpLitExpr + val rightOpVal = rightOp.eval(`val`) as FpLitExpr + return leftOpVal.geq(rightOpVal) + } + + override fun new(leftOp: Expr, rightOp: Expr): FpGeqExpr = of(leftOp, rightOp) + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpGtExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpGtExpr.kt index d6e7ca8a7f..fe770b7186 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpGtExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpGtExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.fptype import hu.bme.mit.theta.core.model.Valuation @@ -27,33 +26,26 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("FpGt") -data class FpGtExpr( - override val leftOp: Expr, - override val rightOp: Expr -) : GtExpr() { - init { - checkAllTypesEqual(leftOp, rightOp) - } +data class FpGtExpr(override val leftOp: Expr, override val rightOp: Expr) : + GtExpr() { + init { + checkAllTypesEqual(leftOp, rightOp) + } - companion object { - @JvmStatic - fun of(leftOp: Expr, rightOp: Expr) = - FpGtExpr(leftOp, rightOp) + companion object { + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = FpGtExpr(leftOp, rightOp) - @JvmStatic - fun create(leftOp: Expr<*>, rightOp: Expr<*>) = - FpGtExpr(castFp(leftOp), castFp(rightOp)) - } + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = FpGtExpr(castFp(leftOp), castFp(rightOp)) + } - override fun eval(`val`: Valuation): BoolLitExpr { - val leftOpVal = leftOp.eval(`val`) as FpLitExpr - val rightOpVal = rightOp.eval(`val`) as FpLitExpr - return leftOpVal.gt(rightOpVal) - } + override fun eval(`val`: Valuation): BoolLitExpr { + val leftOpVal = leftOp.eval(`val`) as FpLitExpr + val rightOpVal = rightOp.eval(`val`) as FpLitExpr + return leftOpVal.gt(rightOpVal) + } - override fun new(leftOp: Expr, rightOp: Expr): FpGtExpr = - of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): FpGtExpr = of(leftOp, rightOp) - override fun toString(): String = super.toString() + override fun toString(): String = super.toString() } - diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpIsInfiniteExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpIsInfiniteExpr.kt index dd2ca24b4d..5153bb7d41 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpIsInfiniteExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpIsInfiniteExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.fptype import hu.bme.mit.theta.core.model.Valuation @@ -29,32 +28,29 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("FpIsInfinite") -data class FpIsInfiniteExpr( - override val op: Expr -) : UnaryExpr() { +data class FpIsInfiniteExpr(override val op: Expr) : UnaryExpr() { - companion object { - private const val OPERATOR_LABEL = "isinfinite" + companion object { + private const val OPERATOR_LABEL = "isinfinite" - @JvmStatic - fun of(op: Expr) = FpIsInfiniteExpr(op) + @JvmStatic fun of(op: Expr) = FpIsInfiniteExpr(op) - @JvmStatic - fun create(op: Expr<*>) = FpIsInfiniteExpr(castFp(op)) - } + @JvmStatic fun create(op: Expr<*>) = FpIsInfiniteExpr(castFp(op)) + } - override val type: BoolType get() = Bool() + override val type: BoolType + get() = Bool() - override fun eval(`val`: Valuation): BoolLitExpr { - val opVal = op.eval(`val`) as FpLitExpr - val or = Or(Bool(opVal.isNegativeInfinity()), Bool(opVal.isPositiveInfinity())) - return or.eval(`val`) - } + override fun eval(`val`: Valuation): BoolLitExpr { + val opVal = op.eval(`val`) as FpLitExpr + val or = Or(Bool(opVal.isNegativeInfinity()), Bool(opVal.isPositiveInfinity())) + return or.eval(`val`) + } - override fun new(op: Expr): FpIsInfiniteExpr = of(op) + override fun new(op: Expr): FpIsInfiniteExpr = of(op) - override val operatorLabel: String get() = OPERATOR_LABEL + override val operatorLabel: String + get() = OPERATOR_LABEL - override fun toString(): String = super.toString() + override fun toString(): String = super.toString() } - diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpIsNanExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpIsNanExpr.kt index 5197bba2e4..7cdacf007a 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpIsNanExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpIsNanExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.fptype import hu.bme.mit.theta.core.model.Valuation @@ -28,28 +27,25 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("FpIsNan") -data class FpIsNanExpr( - override val op: Expr -) : UnaryExpr() { +data class FpIsNanExpr(override val op: Expr) : UnaryExpr() { - companion object { - private const val OPERATOR_LABEL = "fpisnan" + companion object { + private const val OPERATOR_LABEL = "fpisnan" - @JvmStatic - fun of(op: Expr) = FpIsNanExpr(op) + @JvmStatic fun of(op: Expr) = FpIsNanExpr(op) - @JvmStatic - fun create(op: Expr<*>) = FpIsNanExpr(castFp(op)) - } + @JvmStatic fun create(op: Expr<*>) = FpIsNanExpr(castFp(op)) + } - override val type: BoolType get() = Bool() + override val type: BoolType + get() = Bool() - override fun eval(`val`: Valuation): BoolLitExpr = Bool((op.eval(`val`) as FpLitExpr).isNaN()) + override fun eval(`val`: Valuation): BoolLitExpr = Bool((op.eval(`val`) as FpLitExpr).isNaN()) - override fun new(op: Expr): FpIsNanExpr = of(op) + override fun new(op: Expr): FpIsNanExpr = of(op) - override val operatorLabel: String get() = OPERATOR_LABEL + override val operatorLabel: String + get() = OPERATOR_LABEL - override fun toString(): String = super.toString() + override fun toString(): String = super.toString() } - diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpLeqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpLeqExpr.kt index 5e524560bc..2ae88fb080 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpLeqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpLeqExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.fptype import hu.bme.mit.theta.core.model.Valuation @@ -27,33 +26,26 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("FpLeq") -data class FpLeqExpr( - override val leftOp: Expr, - override val rightOp: Expr -) : LeqExpr() { - init { - checkAllTypesEqual(leftOp, rightOp) - } +data class FpLeqExpr(override val leftOp: Expr, override val rightOp: Expr) : + LeqExpr() { + init { + checkAllTypesEqual(leftOp, rightOp) + } - companion object { - @JvmStatic - fun of(leftOp: Expr, rightOp: Expr) = - FpLeqExpr(leftOp, rightOp) + companion object { + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = FpLeqExpr(leftOp, rightOp) - @JvmStatic - fun create(leftOp: Expr<*>, rightOp: Expr<*>) = - FpLeqExpr(castFp(leftOp), castFp(rightOp)) - } + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = FpLeqExpr(castFp(leftOp), castFp(rightOp)) + } - override fun eval(`val`: Valuation): BoolLitExpr { - val leftOpVal = leftOp.eval(`val`) as FpLitExpr - val rightOpVal = rightOp.eval(`val`) as FpLitExpr - return leftOpVal.leq(rightOpVal) - } + override fun eval(`val`: Valuation): BoolLitExpr { + val leftOpVal = leftOp.eval(`val`) as FpLitExpr + val rightOpVal = rightOp.eval(`val`) as FpLitExpr + return leftOpVal.leq(rightOpVal) + } - override fun new(leftOp: Expr, rightOp: Expr): FpLeqExpr = - of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): FpLeqExpr = of(leftOp, rightOp) - override fun toString(): String = super.toString() + override fun toString(): String = super.toString() } - diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpLitExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpLitExpr.kt index 8371f5916c..f9d3b1dc90 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpLitExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpLitExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.fptype import hu.bme.mit.theta.common.Utils @@ -26,246 +25,235 @@ import hu.bme.mit.theta.core.type.booltype.BoolExprs.True import hu.bme.mit.theta.core.type.booltype.BoolLitExpr import hu.bme.mit.theta.core.type.bvtype.BvLitExpr import hu.bme.mit.theta.core.utils.FpUtils.* +import java.util.* import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import java.util.* @Serializable @SerialName("FpLit") -data class FpLitExpr( - val hidden: Boolean, - val exponent: BvLitExpr, - val significand: BvLitExpr -) : NullaryExpr(), LitExpr, Comparable { +data class FpLitExpr(val hidden: Boolean, val exponent: BvLitExpr, val significand: BvLitExpr) : + NullaryExpr(), LitExpr, Comparable { - companion object { + companion object { - @JvmStatic - fun of(hidden: Boolean, exponent: BvLitExpr, significand: BvLitExpr) = - FpLitExpr(hidden, exponent, significand) + @JvmStatic + fun of(hidden: Boolean, exponent: BvLitExpr, significand: BvLitExpr) = + FpLitExpr(hidden, exponent, significand) - @JvmStatic - fun of(value: BvLitExpr, fpType: FpType): FpLitExpr { - val literal = value.value - require(fpType.exponent + fpType.significand + 1 == literal.size) - return FpLitExpr( - literal[0], - BvLitExpr.of(Arrays.copyOfRange(literal, 1, fpType.exponent + 1)), - BvLitExpr.of( - Arrays.copyOfRange( - literal, - fpType.exponent + 1, - fpType.exponent + fpType.significand + 1 - ) - ) - ) - } + @JvmStatic + fun of(value: BvLitExpr, fpType: FpType): FpLitExpr { + val literal = value.value + require(fpType.exponent + fpType.significand + 1 == literal.size) + return FpLitExpr( + literal[0], + BvLitExpr.of(Arrays.copyOfRange(literal, 1, fpType.exponent + 1)), + BvLitExpr.of( + Arrays.copyOfRange(literal, fpType.exponent + 1, fpType.exponent + fpType.significand + 1) + ), + ) + } - @JvmStatic - fun of(hidden: BvLitExpr, exponent: BvLitExpr, significand: BvLitExpr): FpLitExpr { - val hiddenLit = hidden.value - return FpLitExpr(hiddenLit[0], exponent, significand) - } + @JvmStatic + fun of(hidden: BvLitExpr, exponent: BvLitExpr, significand: BvLitExpr): FpLitExpr { + val hiddenLit = hidden.value + return FpLitExpr(hiddenLit[0], exponent, significand) } + } - override val type: FpType get() = FpType(exponent.type.size, significand.type.size + 1) - override fun eval(`val`: Valuation): FpLitExpr = this + override val type: FpType + get() = FpType(exponent.type.size, significand.type.size + 1) - fun isNaN(): Boolean { - var isNaN = true - for (i in exponent.value) { - isNaN = isNaN && i - } - var atLeastOne = false - for (i in significand.value) { - atLeastOne = atLeastOne || i - } - return isNaN && atLeastOne - } + override fun eval(`val`: Valuation): FpLitExpr = this - fun isPositiveInfinity(): Boolean { - var isNaN = !hidden - for (i in exponent.value) { - isNaN = isNaN && i - } - for (i in significand.value) { - isNaN = isNaN && !i - } - return isNaN + fun isNaN(): Boolean { + var isNaN = true + for (i in exponent.value) { + isNaN = isNaN && i } - - fun isNegativeInfinity(): Boolean { - var isNaN = hidden - for (i in exponent.value) { - isNaN = isNaN && i - } - for (i in significand.value) { - isNaN = isNaN && !i - } - return isNaN + var atLeastOne = false + for (i in significand.value) { + atLeastOne = atLeastOne || i } + return isNaN && atLeastOne + } - fun isNegativeZero(): Boolean { - var isNaN = !hidden - for (i in exponent.value) { - isNaN = isNaN && !i - } - for (i in significand.value) { - isNaN = isNaN && !i - } - return isNaN + fun isPositiveInfinity(): Boolean { + var isNaN = !hidden + for (i in exponent.value) { + isNaN = isNaN && i } + for (i in significand.value) { + isNaN = isNaN && !i + } + return isNaN + } - fun isPositiveZero(): Boolean { - var isNaN = hidden - for (i in exponent.value) { - isNaN = isNaN && !i - } - for (i in significand.value) { - isNaN = isNaN && !i - } - return isNaN + fun isNegativeInfinity(): Boolean { + var isNaN = hidden + for (i in exponent.value) { + isNaN = isNaN && i + } + for (i in significand.value) { + isNaN = isNaN && !i } + return isNaN + } - fun add(roundingMode: FpRoundingMode, that: FpLitExpr): FpLitExpr { - require(this.type == that.type) - val sum = - fpLitExprToBigFloat(roundingMode, this) - .add( - fpLitExprToBigFloat(roundingMode, that), - getMathContext(this.type, roundingMode) - ) - return bigFloatToFpLitExpr(sum, type) + fun isNegativeZero(): Boolean { + var isNaN = !hidden + for (i in exponent.value) { + isNaN = isNaN && !i + } + for (i in significand.value) { + isNaN = isNaN && !i } + return isNaN + } - fun sub(roundingMode: FpRoundingMode, that: FpLitExpr): FpLitExpr { - require(this.type == that.type) - val sub = - fpLitExprToBigFloat(roundingMode, this) - .subtract( - fpLitExprToBigFloat(roundingMode, that), - getMathContext(this.type, roundingMode) - ) - return bigFloatToFpLitExpr(sub, type) + fun isPositiveZero(): Boolean { + var isNaN = hidden + for (i in exponent.value) { + isNaN = isNaN && !i } + for (i in significand.value) { + isNaN = isNaN && !i + } + return isNaN + } - fun pos(): FpLitExpr = this + fun add(roundingMode: FpRoundingMode, that: FpLitExpr): FpLitExpr { + require(this.type == that.type) + val sum = + fpLitExprToBigFloat(roundingMode, this) + .add(fpLitExprToBigFloat(roundingMode, that), getMathContext(this.type, roundingMode)) + return bigFloatToFpLitExpr(sum, type) + } - fun neg(): FpLitExpr { - val neg = fpLitExprToBigFloat(FpRoundingMode.defaultRoundingMode, this).negate() - return bigFloatToFpLitExpr(neg, type) - } + fun sub(roundingMode: FpRoundingMode, that: FpLitExpr): FpLitExpr { + require(this.type == that.type) + val sub = + fpLitExprToBigFloat(roundingMode, this) + .subtract(fpLitExprToBigFloat(roundingMode, that), getMathContext(this.type, roundingMode)) + return bigFloatToFpLitExpr(sub, type) + } - fun mul(roundingMode: FpRoundingMode, that: FpLitExpr): FpLitExpr { - require(this.type == that.type) - val sub = - fpLitExprToBigFloat(roundingMode, this) - .multiply( - fpLitExprToBigFloat(roundingMode, that), - getMathContext(this.type, roundingMode) - ) - return bigFloatToFpLitExpr(sub, type) - } + fun pos(): FpLitExpr = this - fun div(roundingMode: FpRoundingMode, that: FpLitExpr): FpLitExpr { - require(this.type == that.type) - val sub = - fpLitExprToBigFloat(roundingMode, this) - .divide( - fpLitExprToBigFloat(roundingMode, that), - getMathContext(this.type, roundingMode) - ) - return bigFloatToFpLitExpr(sub, type) - } + fun neg(): FpLitExpr { + val neg = fpLitExprToBigFloat(FpRoundingMode.defaultRoundingMode, this).negate() + return bigFloatToFpLitExpr(neg, type) + } - fun eq(that: FpLitExpr): BoolLitExpr { - require(this.type == that.type) - val left = fpLitExprToBigFloat(FpRoundingMode.defaultRoundingMode, this) - val right = fpLitExprToBigFloat(FpRoundingMode.defaultRoundingMode, that) - if (left.isNaN || right.isNaN) { - return False() - } - return Bool(this.hidden == that.hidden && exponent == that.exponent && significand == that.significand) - } + fun mul(roundingMode: FpRoundingMode, that: FpLitExpr): FpLitExpr { + require(this.type == that.type) + val sub = + fpLitExprToBigFloat(roundingMode, this) + .multiply(fpLitExprToBigFloat(roundingMode, that), getMathContext(this.type, roundingMode)) + return bigFloatToFpLitExpr(sub, type) + } - fun assign(that: FpLitExpr): BoolLitExpr { - require(this.type == that.type) - val left = fpLitExprToBigFloat(FpRoundingMode.defaultRoundingMode, this) - val right = fpLitExprToBigFloat(FpRoundingMode.defaultRoundingMode, that) - return Bool(this.hidden == that.hidden && exponent == that.exponent && significand == that.significand) + fun div(roundingMode: FpRoundingMode, that: FpLitExpr): FpLitExpr { + require(this.type == that.type) + val sub = + fpLitExprToBigFloat(roundingMode, this) + .divide(fpLitExprToBigFloat(roundingMode, that), getMathContext(this.type, roundingMode)) + return bigFloatToFpLitExpr(sub, type) + } + + fun eq(that: FpLitExpr): BoolLitExpr { + require(this.type == that.type) + val left = fpLitExprToBigFloat(FpRoundingMode.defaultRoundingMode, this) + val right = fpLitExprToBigFloat(FpRoundingMode.defaultRoundingMode, that) + if (left.isNaN || right.isNaN) { + return False() } + return Bool( + this.hidden == that.hidden && exponent == that.exponent && significand == that.significand + ) + } + + fun assign(that: FpLitExpr): BoolLitExpr { + require(this.type == that.type) + val left = fpLitExprToBigFloat(FpRoundingMode.defaultRoundingMode, this) + val right = fpLitExprToBigFloat(FpRoundingMode.defaultRoundingMode, that) + return Bool( + this.hidden == that.hidden && exponent == that.exponent && significand == that.significand + ) + } - fun gt(that: FpLitExpr): BoolLitExpr { - require(this.type == that.type) - val left = fpLitExprToBigFloat(FpRoundingMode.defaultRoundingMode, this) - val right = fpLitExprToBigFloat(FpRoundingMode.defaultRoundingMode, that) - if (left.isNaN || right.isNaN) { - return False() - } - return if (left.greaterThan(right)) { - True() - } else { - False() - } + fun gt(that: FpLitExpr): BoolLitExpr { + require(this.type == that.type) + val left = fpLitExprToBigFloat(FpRoundingMode.defaultRoundingMode, this) + val right = fpLitExprToBigFloat(FpRoundingMode.defaultRoundingMode, that) + if (left.isNaN || right.isNaN) { + return False() } + return if (left.greaterThan(right)) { + True() + } else { + False() + } + } - fun lt(that: FpLitExpr): BoolLitExpr { - require(this.type == that.type) - val left = fpLitExprToBigFloat(FpRoundingMode.defaultRoundingMode, this) - val right = fpLitExprToBigFloat(FpRoundingMode.defaultRoundingMode, that) - if (left.isNaN || right.isNaN) { - return False() - } - return if (left.lessThan(right)) { - True() - } else { - False() - } + fun lt(that: FpLitExpr): BoolLitExpr { + require(this.type == that.type) + val left = fpLitExprToBigFloat(FpRoundingMode.defaultRoundingMode, this) + val right = fpLitExprToBigFloat(FpRoundingMode.defaultRoundingMode, that) + if (left.isNaN || right.isNaN) { + return False() + } + return if (left.lessThan(right)) { + True() + } else { + False() } + } - fun geq(that: FpLitExpr): BoolLitExpr { - require(this.type == that.type) - val left = fpLitExprToBigFloat(FpRoundingMode.defaultRoundingMode, this) - val right = fpLitExprToBigFloat(FpRoundingMode.defaultRoundingMode, that) - if (left.isNaN || right.isNaN) { - return False() - } - return if (left.greaterThanOrEqualTo(right)) { - True() - } else { - False() - } + fun geq(that: FpLitExpr): BoolLitExpr { + require(this.type == that.type) + val left = fpLitExprToBigFloat(FpRoundingMode.defaultRoundingMode, this) + val right = fpLitExprToBigFloat(FpRoundingMode.defaultRoundingMode, that) + if (left.isNaN || right.isNaN) { + return False() + } + return if (left.greaterThanOrEqualTo(right)) { + True() + } else { + False() } + } - fun leq(that: FpLitExpr): BoolLitExpr { - require(this.type == that.type) - val left = fpLitExprToBigFloat(FpRoundingMode.defaultRoundingMode, this) - val right = fpLitExprToBigFloat(FpRoundingMode.defaultRoundingMode, that) - if (left.isNaN || right.isNaN) { - return False() - } - return if (left.lessThanOrEqualTo(right)) { - True() - } else { - False() - } + fun leq(that: FpLitExpr): BoolLitExpr { + require(this.type == that.type) + val left = fpLitExprToBigFloat(FpRoundingMode.defaultRoundingMode, this) + val right = fpLitExprToBigFloat(FpRoundingMode.defaultRoundingMode, that) + if (left.isNaN || right.isNaN) { + return False() } + return if (left.lessThanOrEqualTo(right)) { + True() + } else { + False() + } + } - fun neq(that: FpLitExpr): BoolLitExpr { - require(this.type == that.type) - val left = fpLitExprToBigFloat(FpRoundingMode.defaultRoundingMode, this) - val right = fpLitExprToBigFloat(FpRoundingMode.defaultRoundingMode, that) - if (left.isNaN || right.isNaN) { - return False() - } - return Bool(!(this.hidden == that.hidden && exponent == that.exponent && significand == that.significand)) + fun neq(that: FpLitExpr): BoolLitExpr { + require(this.type == that.type) + val left = fpLitExprToBigFloat(FpRoundingMode.defaultRoundingMode, this) + val right = fpLitExprToBigFloat(FpRoundingMode.defaultRoundingMode, that) + if (left.isNaN || right.isNaN) { + return False() } + return Bool( + !(this.hidden == that.hidden && exponent == that.exponent && significand == that.significand) + ) + } - override fun toString(): String = Utils.lispStringBuilder(if (hidden) "#b1" else "#b0") - .add(exponent.toString()) - .add(significand.toString()) - .toString() + override fun toString(): String = + Utils.lispStringBuilder(if (hidden) "#b1" else "#b0") + .add(exponent.toString()) + .add(significand.toString()) + .toString() - override fun compareTo(other: FpType): Int = 0 + override fun compareTo(other: FpType): Int = 0 } - diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpLtExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpLtExpr.kt index dd97526a3d..9ded53dc51 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpLtExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpLtExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.fptype import hu.bme.mit.theta.core.model.Valuation @@ -27,35 +26,28 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("FpLt") -data class FpLtExpr( - override val leftOp: Expr, - override val rightOp: Expr -) : LtExpr() { +data class FpLtExpr(override val leftOp: Expr, override val rightOp: Expr) : + LtExpr() { - init { - checkAllTypesEqual(leftOp, rightOp) - } + init { + checkAllTypesEqual(leftOp, rightOp) + } - companion object { + companion object { - @JvmStatic - fun of(leftOp: Expr, rightOp: Expr) = - FpLtExpr(leftOp, rightOp) + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = FpLtExpr(leftOp, rightOp) - @JvmStatic - fun create(leftOp: Expr<*>, rightOp: Expr<*>) = - FpLtExpr(castFp(leftOp), castFp(rightOp)) - } + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = FpLtExpr(castFp(leftOp), castFp(rightOp)) + } - override fun eval(`val`: Valuation): BoolLitExpr { - val leftOpVal = leftOp.eval(`val`) as FpLitExpr - val rightOpVal = rightOp.eval(`val`) as FpLitExpr - return leftOpVal.lt(rightOpVal) - } + override fun eval(`val`: Valuation): BoolLitExpr { + val leftOpVal = leftOp.eval(`val`) as FpLitExpr + val rightOpVal = rightOp.eval(`val`) as FpLitExpr + return leftOpVal.lt(rightOpVal) + } - override fun new(leftOp: Expr, rightOp: Expr): FpLtExpr = - of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): FpLtExpr = of(leftOp, rightOp) - override fun toString(): String = super.toString() + override fun toString(): String = super.toString() } - diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpMaxExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpMaxExpr.kt index 6a762922a9..6ea023abd5 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpMaxExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpMaxExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.fptype import hu.bme.mit.theta.core.model.Valuation @@ -28,47 +27,43 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("FpMax") -data class FpMaxExpr( - override val leftOp: Expr, - override val rightOp: Expr -) : BinaryExpr() { +data class FpMaxExpr(override val leftOp: Expr, override val rightOp: Expr) : + BinaryExpr() { - init { - checkAllTypesEqual(leftOp, rightOp) - } + init { + checkAllTypesEqual(leftOp, rightOp) + } - companion object { + companion object { - private const val OPERATOR_LABEL = "fpmax" + private const val OPERATOR_LABEL = "fpmax" - @JvmStatic - fun of(leftOp: Expr, rightOp: Expr) = - FpMaxExpr(leftOp, rightOp) + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = FpMaxExpr(leftOp, rightOp) - @JvmStatic - fun create(leftOp: Expr<*>, rightOp: Expr<*>) = - FpMaxExpr(castFp(leftOp), castFp(rightOp)) - } + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = FpMaxExpr(castFp(leftOp), castFp(rightOp)) + } - override val type: FpType get() = leftOp.type + override val type: FpType + get() = leftOp.type - override fun eval(`val`: Valuation): LitExpr { - val leftOpVal = leftOp.eval(`val`) as FpLitExpr - val rightOpVal = rightOp.eval(`val`) as FpLitExpr - return if (FpUtils.fpLitExprToBigFloat(null, leftOpVal) - .greaterThan(FpUtils.fpLitExprToBigFloat(null, rightOpVal)) - ) { - leftOpVal - } else { - rightOpVal - } + override fun eval(`val`: Valuation): LitExpr { + val leftOpVal = leftOp.eval(`val`) as FpLitExpr + val rightOpVal = rightOp.eval(`val`) as FpLitExpr + return if ( + FpUtils.fpLitExprToBigFloat(null, leftOpVal) + .greaterThan(FpUtils.fpLitExprToBigFloat(null, rightOpVal)) + ) { + leftOpVal + } else { + rightOpVal } + } - override fun new(leftOp: Expr, rightOp: Expr): FpMaxExpr = - of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): FpMaxExpr = of(leftOp, rightOp) - override val operatorLabel: String get() = OPERATOR_LABEL + override val operatorLabel: String + get() = OPERATOR_LABEL - override fun toString(): String = super.toString() + override fun toString(): String = super.toString() } - diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpMinExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpMinExpr.kt index f6a0c38146..f1a9d4b0a8 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpMinExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpMinExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.fptype import hu.bme.mit.theta.core.model.Valuation @@ -28,47 +27,43 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("FpMin") -data class FpMinExpr( - override val leftOp: Expr, - override val rightOp: Expr -) : BinaryExpr() { +data class FpMinExpr(override val leftOp: Expr, override val rightOp: Expr) : + BinaryExpr() { - init { - checkAllTypesEqual(leftOp, rightOp) - } + init { + checkAllTypesEqual(leftOp, rightOp) + } - companion object { + companion object { - private const val OPERATOR_LABEL = "fpmin" + private const val OPERATOR_LABEL = "fpmin" - @JvmStatic - fun of(leftOp: Expr, rightOp: Expr) = - FpMinExpr(leftOp, rightOp) + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = FpMinExpr(leftOp, rightOp) - @JvmStatic - fun create(leftOp: Expr<*>, rightOp: Expr<*>) = - FpMinExpr(castFp(leftOp), castFp(rightOp)) - } + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = FpMinExpr(castFp(leftOp), castFp(rightOp)) + } - override val type: FpType get() = leftOp.type + override val type: FpType + get() = leftOp.type - override fun eval(`val`: Valuation): LitExpr { - val leftOpVal = leftOp.eval(`val`) as FpLitExpr - val rightOpVal = rightOp.eval(`val`) as FpLitExpr - return if (FpUtils.fpLitExprToBigFloat(null, leftOpVal) - .lessThan(FpUtils.fpLitExprToBigFloat(null, rightOpVal)) - ) { - leftOpVal - } else { - rightOpVal - } + override fun eval(`val`: Valuation): LitExpr { + val leftOpVal = leftOp.eval(`val`) as FpLitExpr + val rightOpVal = rightOp.eval(`val`) as FpLitExpr + return if ( + FpUtils.fpLitExprToBigFloat(null, leftOpVal) + .lessThan(FpUtils.fpLitExprToBigFloat(null, rightOpVal)) + ) { + leftOpVal + } else { + rightOpVal } + } - override fun new(leftOp: Expr, rightOp: Expr): FpMinExpr = - of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): FpMinExpr = of(leftOp, rightOp) - override val operatorLabel: String get() = OPERATOR_LABEL + override val operatorLabel: String + get() = OPERATOR_LABEL - override fun toString(): String = super.toString() + override fun toString(): String = super.toString() } - diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpMulExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpMulExpr.kt index beae266ac7..049d26da12 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpMulExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpMulExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.fptype import hu.bme.mit.theta.core.model.Valuation @@ -26,39 +25,38 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("FpMul") -data class FpMulExpr( - val roundingMode: FpRoundingMode, - override val ops: List> -) : MulExpr() { +data class FpMulExpr(val roundingMode: FpRoundingMode, override val ops: List>) : + MulExpr() { - init { - checkAllTypesEqual(ops) - } + init { + checkAllTypesEqual(ops) + } - companion object { + companion object { - private const val OPERATOR_LABEL = "fpmul" + private const val OPERATOR_LABEL = "fpmul" - @JvmStatic - fun of(roundingMode: FpRoundingMode, ops: Iterable>) = - FpMulExpr(roundingMode, ops.toList()) + @JvmStatic + fun of(roundingMode: FpRoundingMode, ops: Iterable>) = + FpMulExpr(roundingMode, ops.toList()) - @JvmStatic - fun create(roundingMode: FpRoundingMode, ops: List>) = - FpMulExpr(roundingMode, ops.map { castFp(it) }) - } + @JvmStatic + fun create(roundingMode: FpRoundingMode, ops: List>) = + FpMulExpr(roundingMode, ops.map { castFp(it) }) + } - override val type: FpType get() = ops[0].type + override val type: FpType + get() = ops[0].type - override fun eval(`val`: Valuation): FpLitExpr = - ops.drop(1).fold(ops[0].eval(`val`) as FpLitExpr) { acc, op -> - acc.mul(roundingMode, op.eval(`val`) as FpLitExpr) - } + override fun eval(`val`: Valuation): FpLitExpr = + ops.drop(1).fold(ops[0].eval(`val`) as FpLitExpr) { acc, op -> + acc.mul(roundingMode, op.eval(`val`) as FpLitExpr) + } - override fun new(ops: List>): FpMulExpr = of(roundingMode, ops) + override fun new(ops: List>): FpMulExpr = of(roundingMode, ops) - override val operatorLabel: String get() = OPERATOR_LABEL + override val operatorLabel: String + get() = OPERATOR_LABEL - override fun toString(): String = super.toString() + override fun toString(): String = super.toString() } - diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpNegExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpNegExpr.kt index dad971ea49..32908073d2 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpNegExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpNegExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.fptype import hu.bme.mit.theta.core.model.Valuation @@ -25,30 +24,26 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("FpNeg") -data class FpNegExpr( - override val op: Expr -) : NegExpr() { +data class FpNegExpr(override val op: Expr) : NegExpr() { - companion object { + companion object { - private const val OPERATOR_LABEL = "fpneg" + private const val OPERATOR_LABEL = "fpneg" - @JvmStatic - fun of(op: Expr) = FpNegExpr(op) + @JvmStatic fun of(op: Expr) = FpNegExpr(op) - @JvmStatic - fun create(op: Expr<*>) = FpNegExpr(castFp(op)) - } + @JvmStatic fun create(op: Expr<*>) = FpNegExpr(castFp(op)) + } - override val type: FpType get() = op.type + override val type: FpType + get() = op.type - override fun eval(`val`: Valuation): FpLitExpr = - (op.eval(`val`) as FpLitExpr).neg() + override fun eval(`val`: Valuation): FpLitExpr = (op.eval(`val`) as FpLitExpr).neg() - override fun new(op: Expr): FpNegExpr = of(op) + override fun new(op: Expr): FpNegExpr = of(op) - override val operatorLabel: String get() = OPERATOR_LABEL + override val operatorLabel: String + get() = OPERATOR_LABEL - override fun toString(): String = super.toString() + override fun toString(): String = super.toString() } - diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpNeqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpNeqExpr.kt index d6c5586df6..34717b75ac 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpNeqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpNeqExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.fptype import hu.bme.mit.theta.core.model.Valuation @@ -27,35 +26,28 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("FpNeq") -data class FpNeqExpr( - override val leftOp: Expr, - override val rightOp: Expr -) : NeqExpr() { +data class FpNeqExpr(override val leftOp: Expr, override val rightOp: Expr) : + NeqExpr() { - init { - checkAllTypesEqual(leftOp, rightOp) - } + init { + checkAllTypesEqual(leftOp, rightOp) + } - companion object { + companion object { - @JvmStatic - fun of(leftOp: Expr, rightOp: Expr) = - FpNeqExpr(leftOp, rightOp) + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = FpNeqExpr(leftOp, rightOp) - @JvmStatic - fun create(leftOp: Expr<*>, rightOp: Expr<*>) = - FpNeqExpr(castFp(leftOp), castFp(rightOp)) - } + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = FpNeqExpr(castFp(leftOp), castFp(rightOp)) + } - override fun eval(`val`: Valuation): BoolLitExpr { - val leftOpVal = leftOp.eval(`val`) as FpLitExpr - val rightOpVal = rightOp.eval(`val`) as FpLitExpr - return leftOpVal.neq(rightOpVal) - } + override fun eval(`val`: Valuation): BoolLitExpr { + val leftOpVal = leftOp.eval(`val`) as FpLitExpr + val rightOpVal = rightOp.eval(`val`) as FpLitExpr + return leftOpVal.neq(rightOpVal) + } - override fun new(leftOp: Expr, rightOp: Expr): FpNeqExpr = - of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): FpNeqExpr = of(leftOp, rightOp) - override fun toString(): String = super.toString() + override fun toString(): String = super.toString() } - diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpPosExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpPosExpr.kt index e1bee68d72..772c1dad31 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpPosExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpPosExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.fptype import hu.bme.mit.theta.core.model.Valuation @@ -25,28 +24,24 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("FpPos") -data class FpPosExpr( - override val op: Expr -) : PosExpr() { - companion object { - private const val OPERATOR_LABEL = "fppos" +data class FpPosExpr(override val op: Expr) : PosExpr() { + companion object { + private const val OPERATOR_LABEL = "fppos" - @JvmStatic - fun of(op: Expr) = FpPosExpr(op) + @JvmStatic fun of(op: Expr) = FpPosExpr(op) - @JvmStatic - fun create(op: Expr<*>) = FpPosExpr(castFp(op)) - } + @JvmStatic fun create(op: Expr<*>) = FpPosExpr(castFp(op)) + } - override val type: FpType get() = op.type + override val type: FpType + get() = op.type - override fun eval(`val`: Valuation): FpLitExpr = - (op.eval(`val`) as FpLitExpr).pos() + override fun eval(`val`: Valuation): FpLitExpr = (op.eval(`val`) as FpLitExpr).pos() - override fun new(op: Expr): FpPosExpr = of(op) + override fun new(op: Expr): FpPosExpr = of(op) - override val operatorLabel: String get() = OPERATOR_LABEL + override val operatorLabel: String + get() = OPERATOR_LABEL - override fun toString(): String = super.toString() + override fun toString(): String = super.toString() } - diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpRemExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpRemExpr.kt index 6902b3f3f7..f46957afc8 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpRemExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpRemExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.fptype import hu.bme.mit.theta.core.model.Valuation @@ -27,44 +26,39 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("FpRem") -data class FpRemExpr( - override val leftOp: Expr, - override val rightOp: Expr -) : BinaryExpr() { +data class FpRemExpr(override val leftOp: Expr, override val rightOp: Expr) : + BinaryExpr() { - init { - checkAllTypesEqual(leftOp, rightOp) - } + init { + checkAllTypesEqual(leftOp, rightOp) + } - companion object { + companion object { - private const val OPERATOR_LABEL = "fprem" + private const val OPERATOR_LABEL = "fprem" - @JvmStatic - fun of(leftOp: Expr, rightOp: Expr) = - FpRemExpr(leftOp, rightOp) + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = FpRemExpr(leftOp, rightOp) - @JvmStatic - fun create(leftOp: Expr<*>, rightOp: Expr<*>) = - FpRemExpr(castFp(leftOp), castFp(rightOp)) - } + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = FpRemExpr(castFp(leftOp), castFp(rightOp)) + } - override val type: FpType get() = leftOp.type + override val type: FpType + get() = leftOp.type - override fun eval(`val`: Valuation): FpLitExpr { - val leftOpVal = leftOp.eval(`val`) as FpLitExpr - val rightOpVal = rightOp.eval(`val`) as FpLitExpr - val leftFloat = fpLitExprToBigFloat(null, leftOpVal) - val rightFloat = fpLitExprToBigFloat(null, rightOpVal) - val remainder = leftFloat.remainder(rightFloat, getMathContext(this.type, null)) - return bigFloatToFpLitExpr(remainder, this.type) - } + override fun eval(`val`: Valuation): FpLitExpr { + val leftOpVal = leftOp.eval(`val`) as FpLitExpr + val rightOpVal = rightOp.eval(`val`) as FpLitExpr + val leftFloat = fpLitExprToBigFloat(null, leftOpVal) + val rightFloat = fpLitExprToBigFloat(null, rightOpVal) + val remainder = leftFloat.remainder(rightFloat, getMathContext(this.type, null)) + return bigFloatToFpLitExpr(remainder, this.type) + } - override fun new(leftOp: Expr, rightOp: Expr): FpRemExpr = - of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): FpRemExpr = of(leftOp, rightOp) - override val operatorLabel: String get() = OPERATOR_LABEL + override val operatorLabel: String + get() = OPERATOR_LABEL - override fun toString(): String = super.toString() + override fun toString(): String = super.toString() } - diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpRoundToIntegralExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpRoundToIntegralExpr.kt index 26ea6c756f..44caef5702 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpRoundToIntegralExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpRoundToIntegralExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.fptype import hu.bme.mit.theta.core.model.Valuation @@ -27,46 +26,43 @@ import org.kframework.mpfr.BinaryMathContext @Serializable @SerialName("FpRoundToIntegral") -data class FpRoundToIntegralExpr( - val roundingMode: FpRoundingMode, - override val op: Expr -) : UnaryExpr() { - companion object { - private const val OPERATOR_LABEL = "fproundtoint" +data class FpRoundToIntegralExpr(val roundingMode: FpRoundingMode, override val op: Expr) : + UnaryExpr() { + companion object { + private const val OPERATOR_LABEL = "fproundtoint" - @JvmStatic - fun of(roundingMode: FpRoundingMode, op: Expr) = - FpRoundToIntegralExpr(roundingMode, op) + @JvmStatic + fun of(roundingMode: FpRoundingMode, op: Expr) = FpRoundToIntegralExpr(roundingMode, op) - @JvmStatic - fun create(roundingMode: FpRoundingMode, op: Expr<*>) = - FpRoundToIntegralExpr(roundingMode, castFp(op)) - } + @JvmStatic + fun create(roundingMode: FpRoundingMode, op: Expr<*>) = + FpRoundToIntegralExpr(roundingMode, castFp(op)) + } - override val type: FpType get() = op.type + override val type: FpType + get() = op.type - override fun eval(`val`: Valuation): FpLitExpr { - val opVal = op.eval(`val`) as FpLitExpr - val value = FpUtils.fpLitExprToBigFloat(roundingMode, opVal) - val bigInteger = value.toBigInteger() - var round = - value.round( - BinaryMathContext( - bigInteger.bitLength(), - opVal.type.exponent, - FpUtils.getMathContextRoundingMode(roundingMode) - ) - ) - round = round.round(FpUtils.getMathContext(type, roundingMode)) - val fpLitExpr = FpUtils.bigFloatToFpLitExpr(round, this.type) - return fpLitExpr - } + override fun eval(`val`: Valuation): FpLitExpr { + val opVal = op.eval(`val`) as FpLitExpr + val value = FpUtils.fpLitExprToBigFloat(roundingMode, opVal) + val bigInteger = value.toBigInteger() + var round = + value.round( + BinaryMathContext( + bigInteger.bitLength(), + opVal.type.exponent, + FpUtils.getMathContextRoundingMode(roundingMode), + ) + ) + round = round.round(FpUtils.getMathContext(type, roundingMode)) + val fpLitExpr = FpUtils.bigFloatToFpLitExpr(round, this.type) + return fpLitExpr + } - override fun new(op: Expr): FpRoundToIntegralExpr = - of(roundingMode, op) + override fun new(op: Expr): FpRoundToIntegralExpr = of(roundingMode, op) - override val operatorLabel: String get() = OPERATOR_LABEL + override val operatorLabel: String + get() = OPERATOR_LABEL - override fun toString(): String = super.toString() + override fun toString(): String = super.toString() } - diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpRoundingMode.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpRoundingMode.kt index ca71f87363..c2820e25c6 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpRoundingMode.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpRoundingMode.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.fptype import kotlinx.serialization.SerialName @@ -23,16 +22,14 @@ import kotlinx.serialization.Serializable @SerialName("FpRoundingMode") enum class FpRoundingMode { - RNE, // Round nearest ties to even - RNA, // Round nearest ties to away - RTP, // Round toward positive - RTN, // Round toward negative - RTZ; // Round toward zero + RNE, // Round nearest ties to even + RNA, // Round nearest ties to away + RTP, // Round toward positive + RTN, // Round toward negative + RTZ; // Round toward zero - companion object { + companion object { - @JvmStatic - val defaultRoundingMode: FpRoundingMode = RNE - } + @JvmStatic val defaultRoundingMode: FpRoundingMode = RNE + } } - diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpSqrtExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpSqrtExpr.kt index 6bf5fcb62c..386bbcceff 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpSqrtExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpSqrtExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.fptype import hu.bme.mit.theta.core.model.Valuation @@ -27,38 +26,32 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("FpSqrt") -data class FpSqrtExpr( - val roundingMode: FpRoundingMode, - override val op: Expr -) : UnaryExpr() { +data class FpSqrtExpr(val roundingMode: FpRoundingMode, override val op: Expr) : + UnaryExpr() { - companion object { + companion object { - private const val OPERATOR_LABEL = "fpsqrt" + private const val OPERATOR_LABEL = "fpsqrt" - @JvmStatic - fun of(roundingMode: FpRoundingMode, op: Expr) = - FpSqrtExpr(roundingMode, op) + @JvmStatic fun of(roundingMode: FpRoundingMode, op: Expr) = FpSqrtExpr(roundingMode, op) - @JvmStatic - fun create(roundingMode: FpRoundingMode, op: Expr<*>) = - FpSqrtExpr(roundingMode, castFp(op)) - } + @JvmStatic + fun create(roundingMode: FpRoundingMode, op: Expr<*>) = FpSqrtExpr(roundingMode, castFp(op)) + } - override val type: FpType get() = op.type + override val type: FpType + get() = op.type - override fun eval(`val`: Valuation): LitExpr { - val opVal = op.eval(`val`) as FpLitExpr - val sqrt = fpLitExprToBigFloat(roundingMode, opVal) - .sqrt(getMathContext(type, roundingMode)) - return bigFloatToFpLitExpr(sqrt, type) - } + override fun eval(`val`: Valuation): LitExpr { + val opVal = op.eval(`val`) as FpLitExpr + val sqrt = fpLitExprToBigFloat(roundingMode, opVal).sqrt(getMathContext(type, roundingMode)) + return bigFloatToFpLitExpr(sqrt, type) + } - override fun new(op: Expr): FpSqrtExpr = - of(roundingMode, op) + override fun new(op: Expr): FpSqrtExpr = of(roundingMode, op) - override val operatorLabel: String get() = OPERATOR_LABEL + override val operatorLabel: String + get() = OPERATOR_LABEL - override fun toString(): String = super.toString() + override fun toString(): String = super.toString() } - diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpSubExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpSubExpr.kt index 515cfc8758..4fee702789 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpSubExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpSubExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.fptype import hu.bme.mit.theta.core.model.Valuation @@ -27,41 +26,42 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("FpSub") data class FpSubExpr( - val roundingMode: FpRoundingMode, - override val leftOp: Expr, - override val rightOp: Expr + val roundingMode: FpRoundingMode, + override val leftOp: Expr, + override val rightOp: Expr, ) : SubExpr() { - init { - checkAllTypesEqual(leftOp, rightOp) - } + init { + checkAllTypesEqual(leftOp, rightOp) + } - companion object { + companion object { - private const val OPERATOR_LABEL = "fpsub" + private const val OPERATOR_LABEL = "fpsub" - @JvmStatic - fun of(roundingMode: FpRoundingMode, leftOp: Expr, rightOp: Expr) = - FpSubExpr(roundingMode, leftOp, rightOp) + @JvmStatic + fun of(roundingMode: FpRoundingMode, leftOp: Expr, rightOp: Expr) = + FpSubExpr(roundingMode, leftOp, rightOp) - @JvmStatic - fun create(roundingMode: FpRoundingMode, leftOp: Expr<*>, rightOp: Expr<*>) = - FpSubExpr(roundingMode, castFp(leftOp), castFp(rightOp)) - } + @JvmStatic + fun create(roundingMode: FpRoundingMode, leftOp: Expr<*>, rightOp: Expr<*>) = + FpSubExpr(roundingMode, castFp(leftOp), castFp(rightOp)) + } - override val type: FpType get() = leftOp.type + override val type: FpType + get() = leftOp.type - override fun eval(`val`: Valuation): FpLitExpr { - val leftOpVal = leftOp.eval(`val`) as FpLitExpr - val rightOpVal = rightOp.eval(`val`) as FpLitExpr - return leftOpVal.sub(roundingMode, rightOpVal) - } + override fun eval(`val`: Valuation): FpLitExpr { + val leftOpVal = leftOp.eval(`val`) as FpLitExpr + val rightOpVal = rightOp.eval(`val`) as FpLitExpr + return leftOpVal.sub(roundingMode, rightOpVal) + } - override fun new(leftOp: Expr, rightOp: Expr): FpSubExpr = - of(roundingMode, leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): FpSubExpr = + of(roundingMode, leftOp, rightOp) - override val operatorLabel: String get() = OPERATOR_LABEL + override val operatorLabel: String + get() = OPERATOR_LABEL - override fun toString(): String = super.toString() + override fun toString(): String = super.toString() } - diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpToBvExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpToBvExpr.kt index 5cba2fb34c..cb770558d5 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpToBvExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpToBvExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.fptype import hu.bme.mit.theta.core.model.Valuation @@ -31,51 +30,50 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("FpToBv") data class FpToBvExpr( - val roundingMode: FpRoundingMode, - override val op: Expr, - val size: Int, - val sgn: Boolean + val roundingMode: FpRoundingMode, + override val op: Expr, + val size: Int, + val sgn: Boolean, ) : UnaryExpr() { - companion object { + companion object { - private const val OPERATOR_LABEL = "fptobv" + private const val OPERATOR_LABEL = "fptobv" - @JvmStatic - fun of(roundingMode: FpRoundingMode, op: Expr, size: Int, sgn: Boolean) = - FpToBvExpr(roundingMode, op, size, sgn) + @JvmStatic + fun of(roundingMode: FpRoundingMode, op: Expr, size: Int, sgn: Boolean) = + FpToBvExpr(roundingMode, op, size, sgn) - @JvmStatic - fun create(roundingMode: FpRoundingMode, op: Expr<*>, size: Int, sgn: Boolean) = - FpToBvExpr(roundingMode, castFp(op), size, sgn) - } + @JvmStatic + fun create(roundingMode: FpRoundingMode, op: Expr<*>, size: Int, sgn: Boolean) = + FpToBvExpr(roundingMode, castFp(op), size, sgn) + } - override val type: BvType get() = BvType.of(size) + override val type: BvType + get() = BvType.of(size) - override fun eval(`val`: Valuation): BvLitExpr { - val op = op.eval(`val`) as FpLitExpr - val bigIntegerValue = fpLitExprToBigFloat(roundingMode, op).toBigInteger() - return if (sgn) { - bigIntegerToSignedBvLitExpr(bigIntegerValue, size) - } else { - bigIntegerToUnsignedBvLitExpr(bigIntegerValue, size) - } + override fun eval(`val`: Valuation): BvLitExpr { + val op = op.eval(`val`) as FpLitExpr + val bigIntegerValue = fpLitExprToBigFloat(roundingMode, op).toBigInteger() + return if (sgn) { + bigIntegerToSignedBvLitExpr(bigIntegerValue, size) + } else { + bigIntegerToUnsignedBvLitExpr(bigIntegerValue, size) } + } - override fun new(op: Expr): FpToBvExpr = - of(roundingMode, op, size, sgn) + override fun new(op: Expr): FpToBvExpr = of(roundingMode, op, size, sgn) - override val operatorLabel: String = - (OPERATOR_LABEL - + "[" - + "[" - + size - + "'" - + (if (sgn) "s" else "u") - + "][" - + roundingMode.name - + "]") + override val operatorLabel: String = + (OPERATOR_LABEL + + "[" + + "[" + + size + + "'" + + (if (sgn) "s" else "u") + + "][" + + roundingMode.name + + "]") - override fun toString(): String = super.toString() + override fun toString(): String = super.toString() } - diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpToFpExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpToFpExpr.kt index 9785b3d03f..0871bfa58f 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpToFpExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpToFpExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.fptype import hu.bme.mit.theta.core.model.Valuation @@ -28,37 +27,35 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("FpToFp") data class FpToFpExpr( - val roundingMode: FpRoundingMode, - override val op: Expr, - val expBits: Int, - val signBits: Int + val roundingMode: FpRoundingMode, + override val op: Expr, + val expBits: Int, + val signBits: Int, ) : UnaryExpr() { - companion object { - private const val OPERATOR_LABEL = "fptofp" + companion object { + private const val OPERATOR_LABEL = "fptofp" - @JvmStatic - fun of(roundingMode: FpRoundingMode, op: Expr, expBits: Int, signBits: Int) = - FpToFpExpr(roundingMode, op, expBits, signBits) + @JvmStatic + fun of(roundingMode: FpRoundingMode, op: Expr, expBits: Int, signBits: Int) = + FpToFpExpr(roundingMode, op, expBits, signBits) - @JvmStatic - fun create(roundingMode: FpRoundingMode, op: Expr<*>, expBits: Int, signBits: Int) = - FpToFpExpr(roundingMode, castFp(op), expBits, signBits) - } + @JvmStatic + fun create(roundingMode: FpRoundingMode, op: Expr<*>, expBits: Int, signBits: Int) = + FpToFpExpr(roundingMode, castFp(op), expBits, signBits) + } - override val type: FpType get() = FpType(expBits, signBits) + override val type: FpType + get() = FpType(expBits, signBits) - override fun eval(`val`: Valuation): FpLitExpr { - val op = op.eval(`val`) as FpLitExpr - val value = fpLitExprToBigFloat(roundingMode, op) - return bigFloatToFpLitExpr(value, type) - } + override fun eval(`val`: Valuation): FpLitExpr { + val op = op.eval(`val`) as FpLitExpr + val value = fpLitExprToBigFloat(roundingMode, op) + return bigFloatToFpLitExpr(value, type) + } - override fun new(op: Expr): FpToFpExpr = - of(roundingMode, op, expBits, signBits) + override fun new(op: Expr): FpToFpExpr = of(roundingMode, op, expBits, signBits) - override val operatorLabel: String = - "$OPERATOR_LABEL[$expBits,$signBits]" + override val operatorLabel: String = "$OPERATOR_LABEL[$expBits,$signBits]" - override fun toString(): String = super.toString() + override fun toString(): String = super.toString() } - diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpType.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpType.kt index a53edc0a7f..808af12422 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpType.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpType.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.fptype import hu.bme.mit.theta.common.Utils @@ -25,49 +24,58 @@ import kotlinx.serialization.Serializable @Serializable @SerialName(FpType.TYPE_LABEL) -data class FpType( - val exponent: Int, - val significand: Int -) : Equational, Additive, Multiplicative, Ordered { - - init { - require(exponent > 1) { "Exponent must be greater than 1" } - require(significand > 1) { "Significand must be greater than 1" } - } - - companion object { - - internal const val TYPE_LABEL = "Fp" - - @JvmStatic - fun of(exponent: Int, significand: Int): FpType = FpType(exponent, significand) - } - - override fun Eq(leftOp: Expr, rightOp: Expr): EqExpr = FpEqExpr(leftOp, rightOp) - override fun Neq(leftOp: Expr, rightOp: Expr): NeqExpr = FpNeqExpr(leftOp, rightOp) - override fun Add(ops: Iterable>): AddExpr = - FpExprs.Add(FpRoundingMode.defaultRoundingMode, ops) - - override fun Sub(leftOp: Expr, rightOp: Expr): SubExpr = - FpExprs.Sub(FpRoundingMode.defaultRoundingMode, leftOp, rightOp) - - override fun Pos(op: Expr): PosExpr = FpExprs.Pos(op) - override fun Neg(op: Expr): NegExpr = FpExprs.Neg(op) - override fun Mul(ops: Iterable>): MulExpr = - FpExprs.Mul(FpRoundingMode.defaultRoundingMode, ops) - - override fun Div(leftOp: Expr, rightOp: Expr): DivExpr = - FpExprs.Div(FpRoundingMode.defaultRoundingMode, leftOp, rightOp) - - override fun Lt(leftOp: Expr, rightOp: Expr): LtExpr = FpExprs.Lt(leftOp, rightOp) - override fun Leq(leftOp: Expr, rightOp: Expr): LeqExpr = FpExprs.Leq(leftOp, rightOp) - override fun Gt(leftOp: Expr, rightOp: Expr): GtExpr = FpExprs.Gt(leftOp, rightOp) - override fun Geq(leftOp: Expr, rightOp: Expr): GeqExpr = FpExprs.Geq(leftOp, rightOp) - override val domainSize: DomainSize - get() = DomainSize.of( - BigInteger.TWO.pow(significand).multiply(BigInteger.TWO.pow(exponent)) - ) - - override fun toString(): String = Utils.lispStringBuilder(TYPE_LABEL).add(exponent).add(significand).toString() -} +data class FpType(val exponent: Int, val significand: Int) : + Equational, Additive, Multiplicative, Ordered { + + init { + require(exponent > 1) { "Exponent must be greater than 1" } + require(significand > 1) { "Significand must be greater than 1" } + } + + companion object { + + internal const val TYPE_LABEL = "Fp" + + @JvmStatic fun of(exponent: Int, significand: Int): FpType = FpType(exponent, significand) + } + + override fun Eq(leftOp: Expr, rightOp: Expr): EqExpr = + FpEqExpr(leftOp, rightOp) + + override fun Neq(leftOp: Expr, rightOp: Expr): NeqExpr = + FpNeqExpr(leftOp, rightOp) + + override fun Add(ops: Iterable>): AddExpr = + FpExprs.Add(FpRoundingMode.defaultRoundingMode, ops) + + override fun Sub(leftOp: Expr, rightOp: Expr): SubExpr = + FpExprs.Sub(FpRoundingMode.defaultRoundingMode, leftOp, rightOp) + override fun Pos(op: Expr): PosExpr = FpExprs.Pos(op) + + override fun Neg(op: Expr): NegExpr = FpExprs.Neg(op) + + override fun Mul(ops: Iterable>): MulExpr = + FpExprs.Mul(FpRoundingMode.defaultRoundingMode, ops) + + override fun Div(leftOp: Expr, rightOp: Expr): DivExpr = + FpExprs.Div(FpRoundingMode.defaultRoundingMode, leftOp, rightOp) + + override fun Lt(leftOp: Expr, rightOp: Expr): LtExpr = + FpExprs.Lt(leftOp, rightOp) + + override fun Leq(leftOp: Expr, rightOp: Expr): LeqExpr = + FpExprs.Leq(leftOp, rightOp) + + override fun Gt(leftOp: Expr, rightOp: Expr): GtExpr = + FpExprs.Gt(leftOp, rightOp) + + override fun Geq(leftOp: Expr, rightOp: Expr): GeqExpr = + FpExprs.Geq(leftOp, rightOp) + + override val domainSize: DomainSize + get() = DomainSize.of(BigInteger.TWO.pow(significand).multiply(BigInteger.TWO.pow(exponent))) + + override fun toString(): String = + Utils.lispStringBuilder(TYPE_LABEL).add(exponent).add(significand).toString() +} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/functype/FuncAppExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/functype/FuncAppExpr.kt index 0a96e2e41d..c69d93001c 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/functype/FuncAppExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/functype/FuncAppExpr.kt @@ -1,3 +1,18 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package hu.bme.mit.theta.core.type.functype import hu.bme.mit.theta.common.Utils @@ -9,58 +24,56 @@ import hu.bme.mit.theta.core.utils.TypeUtils.cast import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -/** - * Function application expression for function types. - */ +/** Function application expression for function types. */ @Serializable @SerialName("FuncAppExpr") data class FuncAppExpr( - val func: Expr>, - val param: Expr + val func: Expr>, + val param: Expr, ) : Expr { - companion object { + companion object { - @JvmStatic - fun of( - func: Expr>, - param: Expr - ) = FuncAppExpr(func, param) + @JvmStatic + fun of( + func: Expr>, + param: Expr, + ) = FuncAppExpr(func, param) - @Suppress("UNCHECKED_CAST") - @JvmStatic - fun create( - func: Expr<*>, - param: Expr<*> - ): FuncAppExpr { - val funcType = func.type as FuncType - val newFunc = cast(func, funcType) - val newParam = cast(param, funcType.paramType) - return of(newFunc, newParam) - } + @Suppress("UNCHECKED_CAST") + @JvmStatic + fun create( + func: Expr<*>, + param: Expr<*>, + ): FuncAppExpr { + val funcType = func.type as FuncType + val newFunc = cast(func, funcType) + val newParam = cast(param, funcType.paramType) + return of(newFunc, newParam) } + } - override val type: ResultType = func.type.resultType - override fun eval(`val`: Valuation): LitExpr = throw UnsupportedOperationException() - override val ops: List> = listOf(func, param) - override fun withOps(ops: List>): Expr { - require(ops.size == 2) - return cast(create(ops[0], ops[1]), type) - } + override val type: ResultType = func.type.resultType - fun with( - func: Expr>, - param: Expr - ): FuncAppExpr = - if (this.func == func && this.param == param) this else of(func, param) + override fun eval(`val`: Valuation): LitExpr = throw UnsupportedOperationException() - fun withFunc(func: Expr>): FuncAppExpr = - with(func, param) + override val ops: List> = listOf(func, param) - fun withParam(param: Expr): FuncAppExpr = - with(func, param) + override fun withOps(ops: List>): Expr { + require(ops.size == 2) + return cast(create(ops[0], ops[1]), type) + } - override fun toString(): String = - Utils.lispStringBuilder().add(func).body().add(param).toString() -} + fun with( + func: Expr>, + param: Expr, + ): FuncAppExpr = + if (this.func == func && this.param == param) this else of(func, param) + fun withFunc(func: Expr>): FuncAppExpr = + with(func, param) + + fun withParam(param: Expr): FuncAppExpr = with(func, param) + + override fun toString(): String = Utils.lispStringBuilder().add(func).body().add(param).toString() +} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/functype/FuncLitExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/functype/FuncLitExpr.kt index fda0b66aa7..f02a3eb92f 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/functype/FuncLitExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/functype/FuncLitExpr.kt @@ -1,3 +1,18 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package hu.bme.mit.theta.core.type.functype import hu.bme.mit.theta.common.Utils @@ -10,38 +25,41 @@ import hu.bme.mit.theta.core.utils.TypeUtils.cast import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -/** - * Function literal expression (lambda abstraction) for function types. - */ +/** Function literal expression (lambda abstraction) for function types. */ @Serializable @SerialName("FuncLitExpr") data class FuncLitExpr( - val param: ParamDecl, - val result: Expr + val param: ParamDecl, + val result: Expr, ) : LitExpr> { - companion object { + companion object { + + private const val OPERATOR_LABEL = "func" + + @JvmStatic + fun of( + param: ParamDecl, + result: Expr, + ) = FuncLitExpr(param, result) + } + + override val type: FuncType = FuncType.of(param.type, result.type) - private const val OPERATOR_LABEL = "func" + override fun eval(`val`: Valuation): LitExpr> = this - @JvmStatic - fun of(param: ParamDecl, result: Expr) = - FuncLitExpr(param, result) - } + override val ops: List> = listOf(result) - override val type: FuncType = FuncType.of(param.type, result.type) - override fun eval(`val`: Valuation): LitExpr> = this - override val ops: List> = listOf(result) - override fun withOps(ops: List>): FuncLitExpr { - require(ops.size == 1) - return with(cast(ops[0], result.type)) - } + override fun withOps(ops: List>): FuncLitExpr { + require(ops.size == 1) + return with(cast(ops[0], result.type)) + } - fun with(result: Expr): FuncLitExpr = - if (this.result == result) this else of(param, result) + fun with(result: Expr): FuncLitExpr = + if (this.result == result) this else of(param, result) - override fun toString(): String { - val paramString = "(${param.name} ${param.type})" - return Utils.lispStringBuilder(OPERATOR_LABEL).body().add(paramString).add(result).toString() - } + override fun toString(): String { + val paramString = "(${param.name} ${param.type})" + return Utils.lispStringBuilder(OPERATOR_LABEL).body().add(paramString).add(result).toString() + } } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/functype/FuncType.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/functype/FuncType.kt index 9d50404593..c213403712 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/functype/FuncType.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/functype/FuncType.kt @@ -1,3 +1,18 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package hu.bme.mit.theta.core.type.functype import hu.bme.mit.theta.common.Utils @@ -6,26 +21,26 @@ import hu.bme.mit.theta.core.type.Type import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -/** - * Represents a function type from ParamType to ResultType. - */ +/** Represents a function type from ParamType to ResultType. */ @Serializable @SerialName(FuncType.TYPE_LABEL) data class FuncType( - val paramType: ParamType, - val resultType: ResultType + val paramType: ParamType, + val resultType: ResultType, ) : Type { - companion object { + companion object { - internal const val TYPE_LABEL = "Func" + internal const val TYPE_LABEL = "Func" - @JvmStatic - fun of(paramType: ParamType, resultType: ResultType) = - FuncType(paramType, resultType) - } + @JvmStatic + fun of(paramType: ParamType, resultType: ResultType) = + FuncType(paramType, resultType) + } - override fun toString(): String = Utils.lispStringBuilder(TYPE_LABEL).add(paramType).add(resultType).toString() - override val domainSize: DomainSize get() = throw UnsupportedOperationException() -} + override fun toString(): String = + Utils.lispStringBuilder(TYPE_LABEL).add(paramType).add(resultType).toString() + override val domainSize: DomainSize + get() = throw UnsupportedOperationException() +} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntAddExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntAddExpr.kt index 5b6b1c148c..97cf59d8f0 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntAddExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntAddExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.inttype import hu.bme.mit.theta.core.model.Valuation @@ -21,41 +20,38 @@ import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.abstracttype.AddExpr import hu.bme.mit.theta.core.type.inttype.IntExprs.Int import hu.bme.mit.theta.core.utils.TypeUtils.cast +import java.math.BigInteger import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import java.math.BigInteger @Serializable @SerialName("IntAdd") -data class IntAddExpr( - override val ops: List> -) : AddExpr() { +data class IntAddExpr(override val ops: List>) : AddExpr() { - companion object { + companion object { - private const val OPERATOR_LABEL = "+" + private const val OPERATOR_LABEL = "+" - @JvmStatic - fun of(ops: Iterable>) = IntAddExpr(ops.toList()) + @JvmStatic fun of(ops: Iterable>) = IntAddExpr(ops.toList()) - @JvmStatic - fun create(ops: List>) = IntAddExpr(ops.map { cast(it, Int()) }) - } + @JvmStatic fun create(ops: List>) = IntAddExpr(ops.map { cast(it, Int()) }) + } - override val type: IntType = Int() - override fun eval(`val`: Valuation): IntLitExpr { - var sum = BigInteger.ZERO - ops.forEach { op -> - val opVal = op.eval(`val`) as IntLitExpr - sum = sum.add(opVal.value) - } - return Int(sum) + override val type: IntType = Int() + + override fun eval(`val`: Valuation): IntLitExpr { + var sum = BigInteger.ZERO + ops.forEach { op -> + val opVal = op.eval(`val`) as IntLitExpr + sum = sum.add(opVal.value) } + return Int(sum) + } - override fun new(ops: List>): IntAddExpr = - of(ops) + override fun new(ops: List>): IntAddExpr = of(ops) - override val operatorLabel: String get() = OPERATOR_LABEL - override fun toString(): String = super.toString() -} + override val operatorLabel: String + get() = OPERATOR_LABEL + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntDivExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntDivExpr.kt index dae53df3be..8affa3e82c 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntDivExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntDivExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.inttype import hu.bme.mit.theta.core.model.Valuation @@ -26,31 +25,32 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("IntDiv") -data class IntDivExpr( - override val leftOp: Expr, - override val rightOp: Expr -) : DivExpr() { - - companion object { - - private const val OPERATOR_LABEL = "div" - @JvmStatic - fun of(leftOp: Expr, rightOp: Expr) = IntDivExpr(leftOp, rightOp) - @JvmStatic - fun create(leftOp: Expr<*>, rightOp: Expr<*>) = IntDivExpr(cast(leftOp, Int()), cast(rightOp, Int())) - } - - override val type: IntType = Int() - override fun eval(`val`: Valuation): IntLitExpr { - val leftOpVal = leftOp.eval(`val`) as IntLitExpr - val rightOpVal = rightOp.eval(`val`) as IntLitExpr - return leftOpVal.div(rightOpVal) - } - - override fun new(leftOp: Expr, rightOp: Expr): IntDivExpr = - of(leftOp, rightOp) - - override val operatorLabel: String get() = OPERATOR_LABEL - override fun toString(): String = super.toString() -} +data class IntDivExpr(override val leftOp: Expr, override val rightOp: Expr) : + DivExpr() { + + companion object { + + private const val OPERATOR_LABEL = "div" + + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = IntDivExpr(leftOp, rightOp) + + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + IntDivExpr(cast(leftOp, Int()), cast(rightOp, Int())) + } + override val type: IntType = Int() + + override fun eval(`val`: Valuation): IntLitExpr { + val leftOpVal = leftOp.eval(`val`) as IntLitExpr + val rightOpVal = rightOp.eval(`val`) as IntLitExpr + return leftOpVal.div(rightOpVal) + } + + override fun new(leftOp: Expr, rightOp: Expr): IntDivExpr = of(leftOp, rightOp) + + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntEqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntEqExpr.kt index f6b8c42652..766318db5c 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntEqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntEqExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.inttype import hu.bme.mit.theta.core.model.Valuation @@ -27,29 +26,25 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("IntEq") -data class IntEqExpr( - override val leftOp: Expr, - override val rightOp: Expr -) : EqExpr() { +data class IntEqExpr(override val leftOp: Expr, override val rightOp: Expr) : + EqExpr() { - companion object { + companion object { - @JvmStatic - fun of(leftOp: Expr, rightOp: Expr) = IntEqExpr(leftOp, rightOp) + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = IntEqExpr(leftOp, rightOp) - @JvmStatic - fun create(leftOp: Expr<*>, rightOp: Expr<*>) = IntEqExpr(cast(leftOp, Int()), cast(rightOp, Int())) - } + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + IntEqExpr(cast(leftOp, Int()), cast(rightOp, Int())) + } - override fun eval(`val`: Valuation): BoolLitExpr { - val leftOpVal = leftOp.eval(`val`) as IntLitExpr - val rightOpVal = rightOp.eval(`val`) as IntLitExpr - return leftOpVal.eq(rightOpVal) - } + override fun eval(`val`: Valuation): BoolLitExpr { + val leftOpVal = leftOp.eval(`val`) as IntLitExpr + val rightOpVal = rightOp.eval(`val`) as IntLitExpr + return leftOpVal.eq(rightOpVal) + } - override fun new(leftOp: Expr, rightOp: Expr): IntEqExpr = - of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): IntEqExpr = of(leftOp, rightOp) - override fun toString(): String = super.toString() + override fun toString(): String = super.toString() } - diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntExprs.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntExprs.kt index c1d561b8a8..5d45916453 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntExprs.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntExprs.kt @@ -13,77 +13,53 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.inttype import hu.bme.mit.theta.core.type.Expr import java.math.BigInteger -/** - * Factory and utility methods for integer expressions. - */ +/** Factory and utility methods for integer expressions. */ @Suppress("FunctionName") object IntExprs { - @JvmStatic - fun Int() = IntType + @JvmStatic fun Int() = IntType - @JvmStatic - fun Int(value: Int) = IntLitExpr(BigInteger.valueOf(value.toLong())) + @JvmStatic fun Int(value: Int) = IntLitExpr(BigInteger.valueOf(value.toLong())) - @JvmStatic - fun Int(value: String) = IntLitExpr(BigInteger(value)) + @JvmStatic fun Int(value: String) = IntLitExpr(BigInteger(value)) - @JvmStatic - fun Int(value: BigInteger) = IntLitExpr(value) + @JvmStatic fun Int(value: BigInteger) = IntLitExpr(value) - @JvmStatic - fun ToRat(op: Expr) = IntToRatExpr(op) + @JvmStatic fun ToRat(op: Expr) = IntToRatExpr(op) - @JvmStatic - fun Add(ops: Iterable>) = IntAddExpr.of(ops) + @JvmStatic fun Add(ops: Iterable>) = IntAddExpr.of(ops) - @JvmStatic - fun Add(vararg ops: Expr) = IntAddExpr(ops.asList()) + @JvmStatic fun Add(vararg ops: Expr) = IntAddExpr(ops.asList()) - @JvmStatic - fun Sub(leftOp: Expr, rightOp: Expr) = IntSubExpr(leftOp, rightOp) + @JvmStatic fun Sub(leftOp: Expr, rightOp: Expr) = IntSubExpr(leftOp, rightOp) - @JvmStatic - fun Pos(op: Expr) = IntPosExpr(op) + @JvmStatic fun Pos(op: Expr) = IntPosExpr(op) - @JvmStatic - fun Neg(op: Expr) = IntNegExpr(op) + @JvmStatic fun Neg(op: Expr) = IntNegExpr(op) - @JvmStatic - fun Mul(ops: Iterable>) = IntMulExpr.of(ops) + @JvmStatic fun Mul(ops: Iterable>) = IntMulExpr.of(ops) - @JvmStatic - fun Mul(vararg ops: Expr) = IntMulExpr(ops.asList()) + @JvmStatic fun Mul(vararg ops: Expr) = IntMulExpr(ops.asList()) - @JvmStatic - fun Div(leftOp: Expr, rightOp: Expr) = IntDivExpr(leftOp, rightOp) + @JvmStatic fun Div(leftOp: Expr, rightOp: Expr) = IntDivExpr(leftOp, rightOp) - @JvmStatic - fun Mod(leftOp: Expr, rightOp: Expr) = IntModExpr(leftOp, rightOp) + @JvmStatic fun Mod(leftOp: Expr, rightOp: Expr) = IntModExpr(leftOp, rightOp) - @JvmStatic - fun Rem(leftOp: Expr, rightOp: Expr) = IntRemExpr(leftOp, rightOp) + @JvmStatic fun Rem(leftOp: Expr, rightOp: Expr) = IntRemExpr(leftOp, rightOp) - @JvmStatic - fun Eq(leftOp: Expr, rightOp: Expr) = IntEqExpr(leftOp, rightOp) + @JvmStatic fun Eq(leftOp: Expr, rightOp: Expr) = IntEqExpr(leftOp, rightOp) - @JvmStatic - fun Neq(leftOp: Expr, rightOp: Expr) = IntNeqExpr(leftOp, rightOp) + @JvmStatic fun Neq(leftOp: Expr, rightOp: Expr) = IntNeqExpr(leftOp, rightOp) - @JvmStatic - fun Lt(leftOp: Expr, rightOp: Expr) = IntLtExpr(leftOp, rightOp) + @JvmStatic fun Lt(leftOp: Expr, rightOp: Expr) = IntLtExpr(leftOp, rightOp) - @JvmStatic - fun Leq(leftOp: Expr, rightOp: Expr) = IntLeqExpr(leftOp, rightOp) + @JvmStatic fun Leq(leftOp: Expr, rightOp: Expr) = IntLeqExpr(leftOp, rightOp) - @JvmStatic - fun Gt(leftOp: Expr, rightOp: Expr) = IntGtExpr(leftOp, rightOp) + @JvmStatic fun Gt(leftOp: Expr, rightOp: Expr) = IntGtExpr(leftOp, rightOp) - @JvmStatic - fun Geq(leftOp: Expr, rightOp: Expr) = IntGeqExpr(leftOp, rightOp) -} \ No newline at end of file + @JvmStatic fun Geq(leftOp: Expr, rightOp: Expr) = IntGeqExpr(leftOp, rightOp) +} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntGeqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntGeqExpr.kt index 2374ea3943..0a1e56ca8f 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntGeqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntGeqExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.inttype import hu.bme.mit.theta.core.model.Valuation @@ -27,29 +26,25 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("IntGeq") -data class IntGeqExpr( - override val leftOp: Expr, - override val rightOp: Expr -) : GeqExpr() { +data class IntGeqExpr(override val leftOp: Expr, override val rightOp: Expr) : + GeqExpr() { - companion object { + companion object { - @JvmStatic - fun of(leftOp: Expr, rightOp: Expr) = IntGeqExpr(leftOp, rightOp) + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = IntGeqExpr(leftOp, rightOp) - @JvmStatic - fun create(leftOp: Expr<*>, rightOp: Expr<*>) = IntGeqExpr(cast(leftOp, Int()), cast(rightOp, Int())) - } + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + IntGeqExpr(cast(leftOp, Int()), cast(rightOp, Int())) + } - override fun eval(`val`: Valuation): BoolLitExpr { - val leftOpVal = leftOp.eval(`val`) as IntLitExpr - val rightOpVal = rightOp.eval(`val`) as IntLitExpr - return leftOpVal.geq(rightOpVal) - } + override fun eval(`val`: Valuation): BoolLitExpr { + val leftOpVal = leftOp.eval(`val`) as IntLitExpr + val rightOpVal = rightOp.eval(`val`) as IntLitExpr + return leftOpVal.geq(rightOpVal) + } - override fun new(leftOp: Expr, rightOp: Expr): IntGeqExpr = - of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): IntGeqExpr = of(leftOp, rightOp) - override fun toString(): String = super.toString() + override fun toString(): String = super.toString() } - diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntGtExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntGtExpr.kt index 65475d69c1..f35e06ef21 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntGtExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntGtExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.inttype import hu.bme.mit.theta.core.model.Valuation @@ -27,28 +26,25 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("IntGt") -data class IntGtExpr( - override val leftOp: Expr, - override val rightOp: Expr -) : GtExpr() { +data class IntGtExpr(override val leftOp: Expr, override val rightOp: Expr) : + GtExpr() { - companion object { + companion object { - @JvmStatic - fun of(leftOp: Expr, rightOp: Expr) = IntGtExpr(leftOp, rightOp) - @JvmStatic - fun create(leftOp: Expr<*>, rightOp: Expr<*>) = IntGtExpr(cast(leftOp, Int()), cast(rightOp, Int())) - } + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = IntGtExpr(leftOp, rightOp) - override fun eval(`val`: Valuation): BoolLitExpr { - val leftOpVal = leftOp.eval(`val`) as IntLitExpr - val rightOpVal = rightOp.eval(`val`) as IntLitExpr - return leftOpVal.gt(rightOpVal) - } + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + IntGtExpr(cast(leftOp, Int()), cast(rightOp, Int())) + } - override fun new(leftOp: Expr, rightOp: Expr): IntGtExpr = - of(leftOp, rightOp) + override fun eval(`val`: Valuation): BoolLitExpr { + val leftOpVal = leftOp.eval(`val`) as IntLitExpr + val rightOpVal = rightOp.eval(`val`) as IntLitExpr + return leftOpVal.gt(rightOpVal) + } - override fun toString(): String = super.toString() -} + override fun new(leftOp: Expr, rightOp: Expr): IntGtExpr = of(leftOp, rightOp) + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLeqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLeqExpr.kt index 55e3c18dcd..597f4aa9e1 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLeqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLeqExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.inttype import hu.bme.mit.theta.core.model.Valuation @@ -27,29 +26,25 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("IntLeq") -data class IntLeqExpr( - override val leftOp: Expr, - override val rightOp: Expr -) : LeqExpr() { +data class IntLeqExpr(override val leftOp: Expr, override val rightOp: Expr) : + LeqExpr() { - companion object { + companion object { - @JvmStatic - fun of(leftOp: Expr, rightOp: Expr) = IntLeqExpr(leftOp, rightOp) + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = IntLeqExpr(leftOp, rightOp) - @JvmStatic - fun create(leftOp: Expr<*>, rightOp: Expr<*>) = IntLeqExpr(cast(leftOp, Int()), cast(rightOp, Int())) - } + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + IntLeqExpr(cast(leftOp, Int()), cast(rightOp, Int())) + } - override fun eval(`val`: Valuation): BoolLitExpr { - val leftOpVal = leftOp.eval(`val`) as IntLitExpr - val rightOpVal = rightOp.eval(`val`) as IntLitExpr - return leftOpVal.leq(rightOpVal) - } + override fun eval(`val`: Valuation): BoolLitExpr { + val leftOpVal = leftOp.eval(`val`) as IntLitExpr + val rightOpVal = rightOp.eval(`val`) as IntLitExpr + return leftOpVal.leq(rightOpVal) + } - override fun new(leftOp: Expr, rightOp: Expr): IntLeqExpr = - of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): IntLeqExpr = of(leftOp, rightOp) - override fun toString(): String = super.toString() + override fun toString(): String = super.toString() } - diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLitExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLitExpr.kt index a2fc571c82..3bbb62a0ec 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLitExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLitExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.inttype import hu.bme.mit.theta.core.model.Valuation @@ -24,91 +23,101 @@ import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool import hu.bme.mit.theta.core.type.inttype.IntExprs.Int import hu.bme.mit.theta.core.type.rattype.RatExprs.Rat import hu.bme.mit.theta.core.type.rattype.RatLitExpr +import java.math.BigInteger import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import java.math.BigInteger @Serializable @SerialName("IntLit") -data class IntLitExpr( - @Serializable(with = BigIntegerSerializer::class) - val value: BigInteger -) : NullaryExpr(), LitExpr, Comparable { +data class IntLitExpr(@Serializable(with = BigIntegerSerializer::class) val value: BigInteger) : + NullaryExpr(), LitExpr, Comparable { - companion object { + companion object { - @JvmStatic - fun of(value: BigInteger) = IntLitExpr(value) - } + @JvmStatic fun of(value: BigInteger) = IntLitExpr(value) + } + + override val type: IntType = Int() + + override fun eval(`val`: Valuation): IntLitExpr = this + + fun toRat(): RatLitExpr = Rat(this.value, 1) + + fun add(that: IntLitExpr) = IntLitExpr(this.value.add(that.value)) + + fun sub(that: IntLitExpr) = IntLitExpr(this.value.subtract(that.value)) + + fun neg() = IntLitExpr(this.value.negate()) + + fun pos() = IntLitExpr(this.value) - override val type: IntType = Int() - override fun eval(`val`: Valuation): IntLitExpr = this - fun toRat(): RatLitExpr = Rat(this.value, 1) - fun add(that: IntLitExpr) = IntLitExpr(this.value.add(that.value)) - fun sub(that: IntLitExpr) = IntLitExpr(this.value.subtract(that.value)) - fun neg() = IntLitExpr(this.value.negate()) - fun pos() = IntLitExpr(this.value) - - fun div(that: IntLitExpr): IntLitExpr { - // Semantics: - // 5 div 3 = 1 - // 5 div -3 = -1 - // -5 div 3 = -2 - // -5 div -3 = 2 - var result = this.value.divide(that.value) - if (this.value < BigInteger.ZERO && this.value.mod(that.value.abs()) != BigInteger.ZERO) { - result = result.subtract(BigInteger.valueOf(that.value.signum().toLong())) - } - return IntLitExpr(result) + fun div(that: IntLitExpr): IntLitExpr { + // Semantics: + // 5 div 3 = 1 + // 5 div -3 = -1 + // -5 div 3 = -2 + // -5 div -3 = 2 + var result = this.value.divide(that.value) + if (this.value < BigInteger.ZERO && this.value.mod(that.value.abs()) != BigInteger.ZERO) { + result = result.subtract(BigInteger.valueOf(that.value.signum().toLong())) } + return IntLitExpr(result) + } - fun mod(that: IntLitExpr): IntLitExpr { - // Always positive semantics: - // 5 mod 3 = 2 - // 5 mod -3 = 2 - // -5 mod 3 = 1 - // -5 mod -3 = 1 - var result = this.value.mod(that.value.abs()) - if (result < BigInteger.ZERO) { - result = result.add(that.value.abs()) - } - require(result >= BigInteger.ZERO) - return IntLitExpr(result) + fun mod(that: IntLitExpr): IntLitExpr { + // Always positive semantics: + // 5 mod 3 = 2 + // 5 mod -3 = 2 + // -5 mod 3 = 1 + // -5 mod -3 = 1 + var result = this.value.mod(that.value.abs()) + if (result < BigInteger.ZERO) { + result = result.add(that.value.abs()) } + require(result >= BigInteger.ZERO) + return IntLitExpr(result) + } - fun rem(that: IntLitExpr): IntLitExpr { - // Semantics: - // 5 rem 3 = 2 - // 5 rem -3 = -2 - // -5 rem 3 = 1 - // -5 rem -3 = -1 - val thisAbs = this.value.abs() - val thatAbs = that.value.abs() - return when { - this.value < BigInteger.ZERO && that.value < BigInteger.ZERO -> { - var result = thisAbs.mod(thatAbs) - if (result != BigInteger.ZERO) result = result.subtract(thatAbs) - IntLitExpr(result) - } - - this.value >= BigInteger.ZERO && that.value < BigInteger.ZERO -> IntLitExpr(thisAbs.mod(thatAbs).negate()) - this.value < BigInteger.ZERO && that.value >= BigInteger.ZERO -> { - var result = thisAbs.mod(thatAbs) - if (result != BigInteger.ZERO) result = thatAbs.subtract(result) - IntLitExpr(result) - } - - else -> IntLitExpr(this.value.mod(that.value)) - } + fun rem(that: IntLitExpr): IntLitExpr { + // Semantics: + // 5 rem 3 = 2 + // 5 rem -3 = -2 + // -5 rem 3 = 1 + // -5 rem -3 = -1 + val thisAbs = this.value.abs() + val thatAbs = that.value.abs() + return when { + this.value < BigInteger.ZERO && that.value < BigInteger.ZERO -> { + var result = thisAbs.mod(thatAbs) + if (result != BigInteger.ZERO) result = result.subtract(thatAbs) + IntLitExpr(result) + } + + this.value >= BigInteger.ZERO && that.value < BigInteger.ZERO -> + IntLitExpr(thisAbs.mod(thatAbs).negate()) + this.value < BigInteger.ZERO && that.value >= BigInteger.ZERO -> { + var result = thisAbs.mod(thatAbs) + if (result != BigInteger.ZERO) result = thatAbs.subtract(result) + IntLitExpr(result) + } + + else -> IntLitExpr(this.value.mod(that.value)) } + } - fun eq(that: IntLitExpr) = Bool(this.value == that.value) - fun neq(that: IntLitExpr) = Bool(this.value != that.value) - fun lt(that: IntLitExpr) = Bool(this.value < that.value) - fun leq(that: IntLitExpr) = Bool(this.value <= that.value) - fun gt(that: IntLitExpr) = Bool(this.value > that.value) - fun geq(that: IntLitExpr) = Bool(this.value >= that.value) - override fun compareTo(other: IntLitExpr): Int = this.value.compareTo(other.value) - override fun toString(): String = value.toString() -} + fun eq(that: IntLitExpr) = Bool(this.value == that.value) + + fun neq(that: IntLitExpr) = Bool(this.value != that.value) + + fun lt(that: IntLitExpr) = Bool(this.value < that.value) + fun leq(that: IntLitExpr) = Bool(this.value <= that.value) + + fun gt(that: IntLitExpr) = Bool(this.value > that.value) + + fun geq(that: IntLitExpr) = Bool(this.value >= that.value) + + override fun compareTo(other: IntLitExpr): Int = this.value.compareTo(other.value) + + override fun toString(): String = value.toString() +} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLtExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLtExpr.kt index 19c711b1f8..4ad63f6e47 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLtExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLtExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.inttype import hu.bme.mit.theta.core.model.Valuation @@ -27,30 +26,25 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("IntLt") -data class IntLtExpr( - override val leftOp: Expr, - override val rightOp: Expr -) : LtExpr() { - - companion object { +data class IntLtExpr(override val leftOp: Expr, override val rightOp: Expr) : + LtExpr() { - @JvmStatic - fun of(leftOp: Expr, rightOp: Expr) = IntLtExpr(leftOp, rightOp) + companion object { - @JvmStatic - fun create(leftOp: Expr<*>, rightOp: Expr<*>) = IntLtExpr(cast(leftOp, Int()), cast(rightOp, Int())) - } + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = IntLtExpr(leftOp, rightOp) - override fun eval(`val`: Valuation): BoolLitExpr { - val leftOpVal = leftOp.eval(`val`) as IntLitExpr - val rightOpVal = rightOp.eval(`val`) as IntLitExpr - return leftOpVal.lt(rightOpVal) - } + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + IntLtExpr(cast(leftOp, Int()), cast(rightOp, Int())) + } - override fun new(leftOp: Expr, rightOp: Expr): IntLtExpr = - of(leftOp, rightOp) + override fun eval(`val`: Valuation): BoolLitExpr { + val leftOpVal = leftOp.eval(`val`) as IntLitExpr + val rightOpVal = rightOp.eval(`val`) as IntLitExpr + return leftOpVal.lt(rightOpVal) + } - override fun toString(): String = super.toString() + override fun new(leftOp: Expr, rightOp: Expr): IntLtExpr = of(leftOp, rightOp) + override fun toString(): String = super.toString() } - diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntModExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntModExpr.kt index 1bf357c9af..f2b3f7d04a 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntModExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntModExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.inttype import hu.bme.mit.theta.core.model.Valuation @@ -26,32 +25,32 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("IntMod") -data class IntModExpr( - override val leftOp: Expr, - override val rightOp: Expr -) : ModExpr() { +data class IntModExpr(override val leftOp: Expr, override val rightOp: Expr) : + ModExpr() { - companion object { + companion object { - private const val OPERATOR_LABEL = "mod" - @JvmStatic - fun of(leftOp: Expr, rightOp: Expr) = IntModExpr(leftOp, rightOp) - @JvmStatic - fun create(leftOp: Expr<*>, rightOp: Expr<*>) = IntModExpr(cast(leftOp, Int()), cast(rightOp, Int())) - } + private const val OPERATOR_LABEL = "mod" - override val type: IntType = Int() - override fun eval(`val`: Valuation): IntLitExpr { - val leftOpVal = leftOp.eval(`val`) as IntLitExpr - val rightOpVal = rightOp.eval(`val`) as IntLitExpr - return leftOpVal.mod(rightOpVal) - } + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = IntModExpr(leftOp, rightOp) - override fun new(leftOp: Expr, rightOp: Expr): IntModExpr = - of(leftOp, rightOp) + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + IntModExpr(cast(leftOp, Int()), cast(rightOp, Int())) + } - override val operatorLabel: String get() = OPERATOR_LABEL + override val type: IntType = Int() - override fun toString(): String = super.toString() -} + override fun eval(`val`: Valuation): IntLitExpr { + val leftOpVal = leftOp.eval(`val`) as IntLitExpr + val rightOpVal = rightOp.eval(`val`) as IntLitExpr + return leftOpVal.mod(rightOpVal) + } + + override fun new(leftOp: Expr, rightOp: Expr): IntModExpr = of(leftOp, rightOp) + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntMulExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntMulExpr.kt index 6a2f000070..bf4a548801 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntMulExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntMulExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.inttype import hu.bme.mit.theta.core.model.Valuation @@ -21,39 +20,38 @@ import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.abstracttype.MulExpr import hu.bme.mit.theta.core.type.inttype.IntExprs.Int import hu.bme.mit.theta.core.utils.TypeUtils.cast +import java.math.BigInteger import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import java.math.BigInteger @Serializable @SerialName("IntMul") -data class IntMulExpr( - override val ops: List> -) : MulExpr() { +data class IntMulExpr(override val ops: List>) : MulExpr() { - companion object { + companion object { - private const val OPERATOR_LABEL = "*" - @JvmStatic - fun of(ops: Iterable>) = IntMulExpr(ops.toList()) - @JvmStatic - fun create(ops: List>) = IntMulExpr(ops.map { cast(it, Int()) }) - } + private const val OPERATOR_LABEL = "*" + + @JvmStatic fun of(ops: Iterable>) = IntMulExpr(ops.toList()) - override val type: IntType = Int() - override fun eval(`val`: Valuation): IntLitExpr { - var prod = BigInteger.ONE - for (op in ops) { - val opVal = op.eval(`val`) as IntLitExpr - prod = prod.multiply(opVal.value) - } - return Int(prod) + @JvmStatic fun create(ops: List>) = IntMulExpr(ops.map { cast(it, Int()) }) + } + + override val type: IntType = Int() + + override fun eval(`val`: Valuation): IntLitExpr { + var prod = BigInteger.ONE + for (op in ops) { + val opVal = op.eval(`val`) as IntLitExpr + prod = prod.multiply(opVal.value) } + return Int(prod) + } - override fun new(ops: List>): IntMulExpr = - of(ops) + override fun new(ops: List>): IntMulExpr = of(ops) - override val operatorLabel: String get() = OPERATOR_LABEL - override fun toString(): String = super.toString() -} + override val operatorLabel: String + get() = OPERATOR_LABEL + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntNegExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntNegExpr.kt index b12fe6823d..bd709c8d03 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntNegExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntNegExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.inttype import hu.bme.mit.theta.core.model.Valuation @@ -26,27 +25,28 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("IntNeg") -data class IntNegExpr( - override val op: Expr -) : NegExpr() { - - companion object { - - private const val OPERATOR_LABEL = "-" - @JvmStatic - fun of(op: Expr) = IntNegExpr(op) - @JvmStatic - fun create(op: Expr<*>) = IntNegExpr(cast(op, Int())) - } - - override val type: IntType = Int() - override fun eval(`val`: Valuation): IntLitExpr { - val opVal = op.eval(`val`) as IntLitExpr - return opVal.neg() - } - - override fun new(op: Expr): IntNegExpr = of(op) - override val operatorLabel: String get() = OPERATOR_LABEL - override fun toString(): String = super.toString() -} +data class IntNegExpr(override val op: Expr) : NegExpr() { + + companion object { + + private const val OPERATOR_LABEL = "-" + + @JvmStatic fun of(op: Expr) = IntNegExpr(op) + + @JvmStatic fun create(op: Expr<*>) = IntNegExpr(cast(op, Int())) + } + override val type: IntType = Int() + + override fun eval(`val`: Valuation): IntLitExpr { + val opVal = op.eval(`val`) as IntLitExpr + return opVal.neg() + } + + override fun new(op: Expr): IntNegExpr = of(op) + + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntNeqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntNeqExpr.kt index e9c539765f..b1c55d2d5e 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntNeqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntNeqExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.inttype import hu.bme.mit.theta.core.model.Valuation @@ -27,28 +26,25 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("IntNeq") -data class IntNeqExpr( - override val leftOp: Expr, - override val rightOp: Expr -) : NeqExpr() { +data class IntNeqExpr(override val leftOp: Expr, override val rightOp: Expr) : + NeqExpr() { - companion object { + companion object { - @JvmStatic - fun of(leftOp: Expr, rightOp: Expr) = IntNeqExpr(leftOp, rightOp) - @JvmStatic - fun create(leftOp: Expr<*>, rightOp: Expr<*>) = IntNeqExpr(cast(leftOp, Int()), cast(rightOp, Int())) - } + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = IntNeqExpr(leftOp, rightOp) - override fun eval(`val`: Valuation): BoolLitExpr { - val leftOpVal = leftOp.eval(`val`) as IntLitExpr - val rightOpVal = rightOp.eval(`val`) as IntLitExpr - return leftOpVal.neq(rightOpVal) - } + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + IntNeqExpr(cast(leftOp, Int()), cast(rightOp, Int())) + } - override fun new(leftOp: Expr, rightOp: Expr): IntNeqExpr = - of(leftOp, rightOp) + override fun eval(`val`: Valuation): BoolLitExpr { + val leftOpVal = leftOp.eval(`val`) as IntLitExpr + val rightOpVal = rightOp.eval(`val`) as IntLitExpr + return leftOpVal.neq(rightOpVal) + } - override fun toString(): String = super.toString() -} + override fun new(leftOp: Expr, rightOp: Expr): IntNeqExpr = of(leftOp, rightOp) + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntPosExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntPosExpr.kt index 7b8c5289c2..7f374f14a5 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntPosExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntPosExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.inttype import hu.bme.mit.theta.core.model.Valuation @@ -26,27 +25,28 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("IntPos") -data class IntPosExpr( - override val op: Expr -) : PosExpr() { - - companion object { - - private const val OPERATOR_LABEL = "+" - @JvmStatic - fun of(op: Expr) = IntPosExpr(op) - @JvmStatic - fun create(op: Expr<*>) = IntPosExpr(cast(op, Int())) - } - - override val type: IntType = Int() - override fun eval(`val`: Valuation): IntLitExpr { - val opVal = op.eval(`val`) as IntLitExpr - return opVal.pos() - } - - override fun new(op: Expr): IntPosExpr = of(op) - override val operatorLabel: String get() = OPERATOR_LABEL - override fun toString(): String = super.toString() -} +data class IntPosExpr(override val op: Expr) : PosExpr() { + + companion object { + + private const val OPERATOR_LABEL = "+" + + @JvmStatic fun of(op: Expr) = IntPosExpr(op) + + @JvmStatic fun create(op: Expr<*>) = IntPosExpr(cast(op, Int())) + } + override val type: IntType = Int() + + override fun eval(`val`: Valuation): IntLitExpr { + val opVal = op.eval(`val`) as IntLitExpr + return opVal.pos() + } + + override fun new(op: Expr): IntPosExpr = of(op) + + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntRemExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntRemExpr.kt index 07759b5b80..d2de066908 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntRemExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntRemExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.inttype import hu.bme.mit.theta.core.model.Valuation @@ -26,31 +25,32 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("IntRem") -data class IntRemExpr( - override val leftOp: Expr, - override val rightOp: Expr -) : RemExpr() { - - companion object { - - private const val OPERATOR_LABEL = "rem" - @JvmStatic - fun of(leftOp: Expr, rightOp: Expr) = IntRemExpr(leftOp, rightOp) - @JvmStatic - fun create(leftOp: Expr<*>, rightOp: Expr<*>) = IntRemExpr(cast(leftOp, Int()), cast(rightOp, Int())) - } - - override val type: IntType = Int() - override fun eval(`val`: Valuation): IntLitExpr { - val leftOpVal = leftOp.eval(`val`) as IntLitExpr - val rightOpVal = rightOp.eval(`val`) as IntLitExpr - return leftOpVal.rem(rightOpVal) - } - - override fun new(leftOp: Expr, rightOp: Expr): IntRemExpr = - of(leftOp, rightOp) - - override val operatorLabel: String get() = OPERATOR_LABEL - override fun toString(): String = super.toString() -} +data class IntRemExpr(override val leftOp: Expr, override val rightOp: Expr) : + RemExpr() { + + companion object { + + private const val OPERATOR_LABEL = "rem" + + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = IntRemExpr(leftOp, rightOp) + + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + IntRemExpr(cast(leftOp, Int()), cast(rightOp, Int())) + } + override val type: IntType = Int() + + override fun eval(`val`: Valuation): IntLitExpr { + val leftOpVal = leftOp.eval(`val`) as IntLitExpr + val rightOpVal = rightOp.eval(`val`) as IntLitExpr + return leftOpVal.rem(rightOpVal) + } + + override fun new(leftOp: Expr, rightOp: Expr): IntRemExpr = of(leftOp, rightOp) + + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntSubExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntSubExpr.kt index eda0ef0744..0882522888 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntSubExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntSubExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.inttype import hu.bme.mit.theta.core.model.Valuation @@ -26,31 +25,32 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("IntSub") -data class IntSubExpr( - override val leftOp: Expr, - override val rightOp: Expr -) : SubExpr() { - - companion object { - - private const val OPERATOR_LABEL = "-" - @JvmStatic - fun of(leftOp: Expr, rightOp: Expr) = IntSubExpr(leftOp, rightOp) - @JvmStatic - fun create(leftOp: Expr<*>, rightOp: Expr<*>) = IntSubExpr(cast(leftOp, Int()), cast(rightOp, Int())) - } - - override val type: IntType = Int() - override fun eval(`val`: Valuation): IntLitExpr { - val leftOpVal = leftOp.eval(`val`) as IntLitExpr - val rightOpVal = rightOp.eval(`val`) as IntLitExpr - return leftOpVal.sub(rightOpVal) - } - - override fun new(leftOp: Expr, rightOp: Expr): IntSubExpr = - of(leftOp, rightOp) - - override val operatorLabel: String get() = OPERATOR_LABEL - override fun toString(): String = super.toString() -} +data class IntSubExpr(override val leftOp: Expr, override val rightOp: Expr) : + SubExpr() { + + companion object { + + private const val OPERATOR_LABEL = "-" + + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = IntSubExpr(leftOp, rightOp) + + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + IntSubExpr(cast(leftOp, Int()), cast(rightOp, Int())) + } + override val type: IntType = Int() + + override fun eval(`val`: Valuation): IntLitExpr { + val leftOpVal = leftOp.eval(`val`) as IntLitExpr + val rightOpVal = rightOp.eval(`val`) as IntLitExpr + return leftOpVal.sub(rightOpVal) + } + + override fun new(leftOp: Expr, rightOp: Expr): IntSubExpr = of(leftOp, rightOp) + + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntToRatExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntToRatExpr.kt index ce9b94f3ee..e08537bfa6 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntToRatExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntToRatExpr.kt @@ -13,45 +13,43 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.inttype import hu.bme.mit.theta.core.model.Valuation import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.abstracttype.CastExpr import hu.bme.mit.theta.core.type.inttype.IntExprs.Int +import hu.bme.mit.theta.core.type.rattype.RatExprs.Rat import hu.bme.mit.theta.core.type.rattype.RatLitExpr import hu.bme.mit.theta.core.type.rattype.RatType -import hu.bme.mit.theta.core.type.rattype.RatExprs.Rat import hu.bme.mit.theta.core.utils.TypeUtils.cast import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable @SerialName("IntToRat") -data class IntToRatExpr( - override val op: Expr -) : CastExpr() { +data class IntToRatExpr(override val op: Expr) : CastExpr() { - companion object { + companion object { - private const val OPERATOR_LABEL = "to_rat" + private const val OPERATOR_LABEL = "to_rat" - @JvmStatic - fun of(op: Expr) = IntToRatExpr(op) + @JvmStatic fun of(op: Expr) = IntToRatExpr(op) - @JvmStatic - fun create(op: Expr<*>) = IntToRatExpr(cast(op, Int())) - } + @JvmStatic fun create(op: Expr<*>) = IntToRatExpr(cast(op, Int())) + } - override val type: RatType = Rat() - override fun eval(`val`: Valuation): RatLitExpr { - val opVal = op.eval(`val`) as IntLitExpr - return opVal.toRat() - } + override val type: RatType = Rat() - override fun new(op: Expr): IntToRatExpr = of(op) - override val operatorLabel: String get() = OPERATOR_LABEL - override fun toString(): String = super.toString() -} + override fun eval(`val`: Valuation): RatLitExpr { + val opVal = op.eval(`val`) as IntLitExpr + return opVal.toRat() + } + override fun new(op: Expr): IntToRatExpr = of(op) + + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntType.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntType.kt index c5025e2de5..85a85e16ff 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntType.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntType.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.inttype import hu.bme.mit.theta.core.type.DomainSize @@ -26,35 +25,52 @@ import kotlinx.serialization.Serializable @Serializable @SerialName(IntType.TYPE_LABEL) -object IntType : Additive, Multiplicative, Divisible, Equational, Ordered, - Castable { - - internal const val TYPE_LABEL = "Int" - - @JvmStatic - fun getInstance(): IntType = this - - override fun toString(): String = TYPE_LABEL - - override fun Add(ops: Iterable>) = IntExprs.Add(ops) - override fun Sub(leftOp: Expr, rightOp: Expr) = IntExprs.Sub(leftOp, rightOp) - override fun Pos(op: Expr) = IntExprs.Pos(op) - override fun Neg(op: Expr) = IntExprs.Neg(op) - override fun Mul(ops: Iterable>) = IntExprs.Mul(ops) - override fun Div(leftOp: Expr, rightOp: Expr) = IntExprs.Div(leftOp, rightOp) - override fun Mod(leftOp: Expr, rightOp: Expr) = IntExprs.Mod(leftOp, rightOp) - override fun Rem(leftOp: Expr, rightOp: Expr) = IntExprs.Rem(leftOp, rightOp) - override fun Eq(leftOp: Expr, rightOp: Expr) = IntExprs.Eq(leftOp, rightOp) - override fun Neq(leftOp: Expr, rightOp: Expr) = IntExprs.Neq(leftOp, rightOp) - override fun Lt(leftOp: Expr, rightOp: Expr) = IntExprs.Lt(leftOp, rightOp) - override fun Leq(leftOp: Expr, rightOp: Expr) = IntExprs.Leq(leftOp, rightOp) - override fun Gt(leftOp: Expr, rightOp: Expr) = IntExprs.Gt(leftOp, rightOp) - override fun Geq(leftOp: Expr, rightOp: Expr) = IntExprs.Geq(leftOp, rightOp) - @Suppress("UNCHECKED_CAST") - override fun Cast(op: Expr, type: TargetType): Expr = - if (type is RatType) IntExprs.ToRat(op) as Expr - else throw ClassCastException("Int cannot be cast to $type") - - override val domainSize: DomainSize = DomainSize.INFINITY -} +object IntType : + Additive, + Multiplicative, + Divisible, + Equational, + Ordered, + Castable { + + internal const val TYPE_LABEL = "Int" + + @JvmStatic fun getInstance(): IntType = this + + override fun toString(): String = TYPE_LABEL + + override fun Add(ops: Iterable>) = IntExprs.Add(ops) + + override fun Sub(leftOp: Expr, rightOp: Expr) = IntExprs.Sub(leftOp, rightOp) + + override fun Pos(op: Expr) = IntExprs.Pos(op) + + override fun Neg(op: Expr) = IntExprs.Neg(op) + + override fun Mul(ops: Iterable>) = IntExprs.Mul(ops) + + override fun Div(leftOp: Expr, rightOp: Expr) = IntExprs.Div(leftOp, rightOp) + override fun Mod(leftOp: Expr, rightOp: Expr) = IntExprs.Mod(leftOp, rightOp) + + override fun Rem(leftOp: Expr, rightOp: Expr) = IntExprs.Rem(leftOp, rightOp) + + override fun Eq(leftOp: Expr, rightOp: Expr) = IntExprs.Eq(leftOp, rightOp) + + override fun Neq(leftOp: Expr, rightOp: Expr) = IntExprs.Neq(leftOp, rightOp) + + override fun Lt(leftOp: Expr, rightOp: Expr) = IntExprs.Lt(leftOp, rightOp) + + override fun Leq(leftOp: Expr, rightOp: Expr) = IntExprs.Leq(leftOp, rightOp) + + override fun Gt(leftOp: Expr, rightOp: Expr) = IntExprs.Gt(leftOp, rightOp) + + override fun Geq(leftOp: Expr, rightOp: Expr) = IntExprs.Geq(leftOp, rightOp) + + @Suppress("UNCHECKED_CAST") + override fun Cast(op: Expr, type: TargetType): Expr = + if (type is RatType) IntExprs.ToRat(op) as Expr + else throw ClassCastException("Int cannot be cast to $type") + + override val domainSize: DomainSize = DomainSize.INFINITY +} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatAddExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatAddExpr.kt index eb0e928622..52cf17b079 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatAddExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatAddExpr.kt @@ -13,57 +13,51 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.rattype import hu.bme.mit.theta.core.model.Valuation import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.abstracttype.AddExpr import hu.bme.mit.theta.core.type.rattype.RatExprs.Rat +import java.math.BigInteger import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import java.math.BigInteger @Serializable @SerialName("RatAdd") -class RatAddExpr( - override val ops: List> -) : AddExpr() { +class RatAddExpr(override val ops: List>) : AddExpr() { - companion object { + companion object { - private const val OPERATOR_LABEL = "+" + private const val OPERATOR_LABEL = "+" - @JvmStatic - fun of(ops: Iterable>): RatAddExpr = RatAddExpr(ops.toList()) + @JvmStatic fun of(ops: Iterable>): RatAddExpr = RatAddExpr(ops.toList()) - @Suppress("UNCHECKED_CAST") - @JvmStatic - fun create(ops: Iterable>): RatAddExpr = - RatAddExpr(ops.map { it as Expr }) - } + @Suppress("UNCHECKED_CAST") + @JvmStatic + fun create(ops: Iterable>): RatAddExpr = RatAddExpr(ops.map { it as Expr }) + } - override val type: RatType = Rat() + override val type: RatType = Rat() - override fun eval(`val`: Valuation): RatLitExpr { - var sumNum = BigInteger.ZERO - var sumDenom = BigInteger.ONE - ops.forEach { op -> - val opLit = op.eval(`val`) as RatLitExpr - val leftNum = sumNum - val leftDenom = sumDenom - val rightNum = opLit.num - val rightDenom = opLit.denom - sumNum = leftNum.multiply(rightDenom).add(leftDenom.multiply(rightNum)) - sumDenom = leftDenom.multiply(rightDenom) - } - return Rat(sumNum, sumDenom) + override fun eval(`val`: Valuation): RatLitExpr { + var sumNum = BigInteger.ZERO + var sumDenom = BigInteger.ONE + ops.forEach { op -> + val opLit = op.eval(`val`) as RatLitExpr + val leftNum = sumNum + val leftDenom = sumDenom + val rightNum = opLit.num + val rightDenom = opLit.denom + sumNum = leftNum.multiply(rightDenom).add(leftDenom.multiply(rightNum)) + sumDenom = leftDenom.multiply(rightDenom) } + return Rat(sumNum, sumDenom) + } - override fun new(ops: List>): RatAddExpr = new(ops) + override fun new(ops: List>): RatAddExpr = new(ops) - override val operatorLabel: String = OPERATOR_LABEL + override val operatorLabel: String = OPERATOR_LABEL - override fun toString(): String = super.toString() + override fun toString(): String = super.toString() } - diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatDivExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatDivExpr.kt index a6c52a27a1..d7d7368812 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatDivExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatDivExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.rattype import hu.bme.mit.theta.core.model.Valuation @@ -28,43 +27,44 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("RatDiv") -data class RatDivExpr( - override val leftOp: Expr, - override val rightOp: Expr -) : DivExpr() { +data class RatDivExpr(override val leftOp: Expr, override val rightOp: Expr) : + DivExpr() { + + companion object { + private const val OPERATOR_LABEL = "/" - companion object { - private const val OPERATOR_LABEL = "/" - @JvmStatic - fun of(leftOp: Expr, rightOp: Expr) = RatDivExpr(leftOp, rightOp) - @JvmStatic - fun create(leftOp: Expr<*>, rightOp: Expr<*>) : RatDivExpr { - val newLeftOp = when (leftOp.type) { - is RatType -> cast(leftOp, Rat()) - is IntType -> IntToRatExpr.create(leftOp) - else -> throw IllegalArgumentException("Unsupported type for RatDiv: ${leftOp.type}") - } - val newRightOp = when (rightOp.type) { - is RatType -> cast(rightOp, Rat()) - is IntType -> IntToRatExpr.create(rightOp) - else -> throw IllegalArgumentException("Unsupported type for RatDiv: ${rightOp.type}") - } - return RatDivExpr(newLeftOp, newRightOp) + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = RatDivExpr(leftOp, rightOp) + + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>): RatDivExpr { + val newLeftOp = + when (leftOp.type) { + is RatType -> cast(leftOp, Rat()) + is IntType -> IntToRatExpr.create(leftOp) + else -> throw IllegalArgumentException("Unsupported type for RatDiv: ${leftOp.type}") + } + val newRightOp = + when (rightOp.type) { + is RatType -> cast(rightOp, Rat()) + is IntType -> IntToRatExpr.create(rightOp) + else -> throw IllegalArgumentException("Unsupported type for RatDiv: ${rightOp.type}") } + return RatDivExpr(newLeftOp, newRightOp) } + } - override val type: RatType = Rat() - override fun eval(`val`: Valuation): RatLitExpr { - val leftOpVal = leftOp.eval(`val`) as RatLitExpr - val rightOpVal = rightOp.eval(`val`) as RatLitExpr - return leftOpVal.div(rightOpVal) - } + override val type: RatType = Rat() - override fun new(leftOp: Expr, rightOp: Expr): RatDivExpr = - of(leftOp, rightOp) + override fun eval(`val`: Valuation): RatLitExpr { + val leftOpVal = leftOp.eval(`val`) as RatLitExpr + val rightOpVal = rightOp.eval(`val`) as RatLitExpr + return leftOpVal.div(rightOpVal) + } - override val operatorLabel: String get() = OPERATOR_LABEL + override fun new(leftOp: Expr, rightOp: Expr): RatDivExpr = of(leftOp, rightOp) - override fun toString(): String = super.toString() -} + override val operatorLabel: String + get() = OPERATOR_LABEL + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatEqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatEqExpr.kt index 40a95b0165..334c585fcd 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatEqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatEqExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.rattype import hu.bme.mit.theta.core.model.Valuation @@ -27,29 +26,25 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("RatEq") -data class RatEqExpr( - override val leftOp: Expr, - override val rightOp: Expr -) : EqExpr() { +data class RatEqExpr(override val leftOp: Expr, override val rightOp: Expr) : + EqExpr() { - companion object { + companion object { - @JvmStatic - fun of(leftOp: Expr, rightOp: Expr) = RatEqExpr(leftOp, rightOp) + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = RatEqExpr(leftOp, rightOp) - @JvmStatic - fun create(leftOp: Expr<*>, rightOp: Expr<*>) = RatEqExpr(cast(leftOp, Rat()), cast(rightOp, Rat())) - } + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + RatEqExpr(cast(leftOp, Rat()), cast(rightOp, Rat())) + } - override fun eval(`val`: Valuation): BoolLitExpr { - val leftOpVal = leftOp.eval(`val`) as RatLitExpr - val rightOpVal = rightOp.eval(`val`) as RatLitExpr - return leftOpVal.eq(rightOpVal) - } + override fun eval(`val`: Valuation): BoolLitExpr { + val leftOpVal = leftOp.eval(`val`) as RatLitExpr + val rightOpVal = rightOp.eval(`val`) as RatLitExpr + return leftOpVal.eq(rightOpVal) + } - override fun new(leftOp: Expr, rightOp: Expr): RatEqExpr = - of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): RatEqExpr = of(leftOp, rightOp) - override fun toString(): String = super.toString() + override fun toString(): String = super.toString() } - diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatExprs.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatExprs.kt index ba55a5c4bc..10b7e2a876 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatExprs.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatExprs.kt @@ -13,69 +13,67 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.rattype import hu.bme.mit.theta.core.type.Expr import java.math.BigInteger -/** - * Factory for rational expressions. - */ +/** Factory for rational expressions. */ @Suppress("FunctionName") object RatExprs { - @JvmStatic - fun Rat() = RatType - @JvmStatic - fun Rat(num: Int, denom: Int) = RatLitExpr(BigInteger.valueOf(num.toLong()), BigInteger.valueOf(denom.toLong())) - @JvmStatic - fun Rat(num: Int, denom: String) = RatLitExpr(BigInteger.valueOf(num.toLong()), BigInteger(denom)) - @JvmStatic - fun Rat(num: Int, denom: BigInteger) = RatLitExpr(BigInteger.valueOf(num.toLong()), denom) - @JvmStatic - fun Rat(num: String, denom: Int) = RatLitExpr(BigInteger(num), BigInteger.valueOf(denom.toLong())) - @JvmStatic - fun Rat(num: String, denom: String) = RatLitExpr(BigInteger(num), BigInteger(denom)) - @JvmStatic - fun Rat(num: String, denom: BigInteger) = RatLitExpr(BigInteger(num), denom) - @JvmStatic - fun Rat(num: BigInteger, denom: Int) = RatLitExpr(num, BigInteger.valueOf(denom.toLong())) - @JvmStatic - fun Rat(num: BigInteger, denom: String) = RatLitExpr(num, BigInteger(denom)) - @JvmStatic - fun Rat(num: BigInteger, denom: BigInteger) = RatLitExpr(num, denom) - - @JvmStatic - fun Add(ops: Iterable>) = RatAddExpr.of(ops) - @JvmStatic - fun Sub(leftOp: Expr, rightOp: Expr) = RatSubExpr(leftOp, rightOp) - @JvmStatic - fun Pos(op: Expr) = RatPosExpr(op) - @JvmStatic - fun Neg(op: Expr) = RatNegExpr(op) - @JvmStatic - fun Mul(ops: Iterable>) = RatMulExpr.of(ops) - @JvmStatic - fun Div(leftOp: Expr, rightOp: Expr) = RatDivExpr(leftOp, rightOp) - @JvmStatic - fun Eq(leftOp: Expr, rightOp: Expr) = RatEqExpr(leftOp, rightOp) - @JvmStatic - fun Neq(leftOp: Expr, rightOp: Expr) = RatNeqExpr(leftOp, rightOp) - @JvmStatic - fun Lt(leftOp: Expr, rightOp: Expr) = RatLtExpr(leftOp, rightOp) - @JvmStatic - fun Leq(leftOp: Expr, rightOp: Expr) = RatLeqExpr(leftOp, rightOp) - @JvmStatic - fun Gt(leftOp: Expr, rightOp: Expr) = RatGtExpr(leftOp, rightOp) - @JvmStatic - fun Geq(leftOp: Expr, rightOp: Expr) = RatGeqExpr(leftOp, rightOp) - - @JvmStatic - fun Add(vararg ops: Expr) = RatAddExpr(ops.asList()) - - @JvmStatic - fun Mul(vararg ops: Expr) = RatMulExpr(ops.asList()) - - @JvmStatic - fun ToInt(op: Expr) = RatToIntExpr.of(op) + @JvmStatic fun Rat() = RatType + + @JvmStatic + fun Rat(num: Int, denom: Int) = + RatLitExpr(BigInteger.valueOf(num.toLong()), BigInteger.valueOf(denom.toLong())) + + @JvmStatic + fun Rat(num: Int, denom: String) = RatLitExpr(BigInteger.valueOf(num.toLong()), BigInteger(denom)) + + @JvmStatic + fun Rat(num: Int, denom: BigInteger) = RatLitExpr(BigInteger.valueOf(num.toLong()), denom) + + @JvmStatic + fun Rat(num: String, denom: Int) = RatLitExpr(BigInteger(num), BigInteger.valueOf(denom.toLong())) + + @JvmStatic fun Rat(num: String, denom: String) = RatLitExpr(BigInteger(num), BigInteger(denom)) + + @JvmStatic fun Rat(num: String, denom: BigInteger) = RatLitExpr(BigInteger(num), denom) + + @JvmStatic + fun Rat(num: BigInteger, denom: Int) = RatLitExpr(num, BigInteger.valueOf(denom.toLong())) + + @JvmStatic fun Rat(num: BigInteger, denom: String) = RatLitExpr(num, BigInteger(denom)) + + @JvmStatic fun Rat(num: BigInteger, denom: BigInteger) = RatLitExpr(num, denom) + + @JvmStatic fun Add(ops: Iterable>) = RatAddExpr.of(ops) + + @JvmStatic fun Sub(leftOp: Expr, rightOp: Expr) = RatSubExpr(leftOp, rightOp) + + @JvmStatic fun Pos(op: Expr) = RatPosExpr(op) + + @JvmStatic fun Neg(op: Expr) = RatNegExpr(op) + + @JvmStatic fun Mul(ops: Iterable>) = RatMulExpr.of(ops) + + @JvmStatic fun Div(leftOp: Expr, rightOp: Expr) = RatDivExpr(leftOp, rightOp) + + @JvmStatic fun Eq(leftOp: Expr, rightOp: Expr) = RatEqExpr(leftOp, rightOp) + + @JvmStatic fun Neq(leftOp: Expr, rightOp: Expr) = RatNeqExpr(leftOp, rightOp) + + @JvmStatic fun Lt(leftOp: Expr, rightOp: Expr) = RatLtExpr(leftOp, rightOp) + + @JvmStatic fun Leq(leftOp: Expr, rightOp: Expr) = RatLeqExpr(leftOp, rightOp) + + @JvmStatic fun Gt(leftOp: Expr, rightOp: Expr) = RatGtExpr(leftOp, rightOp) + + @JvmStatic fun Geq(leftOp: Expr, rightOp: Expr) = RatGeqExpr(leftOp, rightOp) + + @JvmStatic fun Add(vararg ops: Expr) = RatAddExpr(ops.asList()) + + @JvmStatic fun Mul(vararg ops: Expr) = RatMulExpr(ops.asList()) + + @JvmStatic fun ToInt(op: Expr) = RatToIntExpr.of(op) } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatGeqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatGeqExpr.kt index 8d23a4d611..76bdc78491 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatGeqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatGeqExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.rattype import hu.bme.mit.theta.core.model.Valuation @@ -27,29 +26,25 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("RatGeq") -data class RatGeqExpr( - override val leftOp: Expr, - override val rightOp: Expr -) : GeqExpr() { +data class RatGeqExpr(override val leftOp: Expr, override val rightOp: Expr) : + GeqExpr() { - companion object { + companion object { - @JvmStatic - fun of(leftOp: Expr, rightOp: Expr) = RatGeqExpr(leftOp, rightOp) + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = RatGeqExpr(leftOp, rightOp) - @JvmStatic - fun create(leftOp: Expr<*>, rightOp: Expr<*>) = RatGeqExpr(cast(leftOp, Rat()), cast(rightOp, Rat())) - } + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + RatGeqExpr(cast(leftOp, Rat()), cast(rightOp, Rat())) + } - override fun eval(`val`: Valuation): BoolLitExpr { - val leftOpVal = leftOp.eval(`val`) as RatLitExpr - val rightOpVal = rightOp.eval(`val`) as RatLitExpr - return leftOpVal.geq(rightOpVal) - } + override fun eval(`val`: Valuation): BoolLitExpr { + val leftOpVal = leftOp.eval(`val`) as RatLitExpr + val rightOpVal = rightOp.eval(`val`) as RatLitExpr + return leftOpVal.geq(rightOpVal) + } - override fun new(leftOp: Expr, rightOp: Expr): RatGeqExpr = - of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): RatGeqExpr = of(leftOp, rightOp) - override fun toString(): String = super.toString() + override fun toString(): String = super.toString() } - diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatGtExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatGtExpr.kt index 25efd943d3..6954cd8391 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatGtExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatGtExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.rattype import hu.bme.mit.theta.core.model.Valuation @@ -27,29 +26,25 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("RatGt") -data class RatGtExpr( - override val leftOp: Expr, - override val rightOp: Expr -) : GtExpr() { +data class RatGtExpr(override val leftOp: Expr, override val rightOp: Expr) : + GtExpr() { - companion object { + companion object { - @JvmStatic - fun of(leftOp: Expr, rightOp: Expr) = RatGtExpr(leftOp, rightOp) + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = RatGtExpr(leftOp, rightOp) - @JvmStatic - fun create(leftOp: Expr<*>, rightOp: Expr<*>) = RatGtExpr(cast(leftOp, Rat()), cast(rightOp, Rat())) - } + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + RatGtExpr(cast(leftOp, Rat()), cast(rightOp, Rat())) + } - override fun eval(`val`: Valuation): BoolLitExpr { - val leftOpVal = leftOp.eval(`val`) as RatLitExpr - val rightOpVal = rightOp.eval(`val`) as RatLitExpr - return leftOpVal.gt(rightOpVal) - } + override fun eval(`val`: Valuation): BoolLitExpr { + val leftOpVal = leftOp.eval(`val`) as RatLitExpr + val rightOpVal = rightOp.eval(`val`) as RatLitExpr + return leftOpVal.gt(rightOpVal) + } - override fun new(leftOp: Expr, rightOp: Expr): RatGtExpr = - of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): RatGtExpr = of(leftOp, rightOp) - override fun toString(): String = super.toString() + override fun toString(): String = super.toString() } - diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatLeqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatLeqExpr.kt index 8bcf96f622..f3123b3efb 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatLeqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatLeqExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.rattype import hu.bme.mit.theta.core.model.Valuation @@ -27,27 +26,24 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("RatLeq") -data class RatLeqExpr( - override val leftOp: Expr, - override val rightOp: Expr -) : LeqExpr() { +data class RatLeqExpr(override val leftOp: Expr, override val rightOp: Expr) : + LeqExpr() { - companion object { - @JvmStatic - fun of(leftOp: Expr, rightOp: Expr) = RatLeqExpr(leftOp, rightOp) - @JvmStatic - fun create(leftOp: Expr<*>, rightOp: Expr<*>) = RatLeqExpr(cast(leftOp, Rat()), cast(rightOp, Rat())) - } + companion object { + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = RatLeqExpr(leftOp, rightOp) - override fun eval(`val`: Valuation): BoolLitExpr { - val leftOpVal = leftOp.eval(`val`) as RatLitExpr - val rightOpVal = rightOp.eval(`val`) as RatLitExpr - return leftOpVal.leq(rightOpVal) - } + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + RatLeqExpr(cast(leftOp, Rat()), cast(rightOp, Rat())) + } - override fun new(leftOp: Expr, rightOp: Expr): RatLeqExpr = - of(leftOp, rightOp) + override fun eval(`val`: Valuation): BoolLitExpr { + val leftOpVal = leftOp.eval(`val`) as RatLitExpr + val rightOpVal = rightOp.eval(`val`) as RatLitExpr + return leftOpVal.leq(rightOpVal) + } - override fun toString(): String = super.toString() -} + override fun new(leftOp: Expr, rightOp: Expr): RatLeqExpr = of(leftOp, rightOp) + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatLitExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatLitExpr.kt index 58cec8f2a1..af30434e1e 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatLitExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatLitExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.rattype import hu.bme.mit.theta.core.model.Valuation @@ -23,79 +22,86 @@ import hu.bme.mit.theta.core.type.NullaryExpr import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool import hu.bme.mit.theta.core.type.inttype.IntLitExpr import hu.bme.mit.theta.core.type.rattype.RatExprs.Rat +import java.math.BigInteger import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import java.math.BigInteger @Serializable @SerialName("RatLit") data class RatLitExpr( - @Serializable(with = BigIntegerSerializer::class) - val num: BigInteger, - @Serializable(with = BigIntegerSerializer::class) - val denom: BigInteger + @Serializable(with = BigIntegerSerializer::class) val num: BigInteger, + @Serializable(with = BigIntegerSerializer::class) val denom: BigInteger, ) : NullaryExpr(), LitExpr, Comparable { - init { - require(denom != BigInteger.ZERO) - } + init { + require(denom != BigInteger.ZERO) + } - companion object { + companion object { - @JvmStatic - fun of(num: BigInteger, denom: BigInteger): RatLitExpr { - require(denom != BigInteger.ZERO) { "Denominator cannot be zero" } + @JvmStatic + fun of(num: BigInteger, denom: BigInteger): RatLitExpr { + require(denom != BigInteger.ZERO) { "Denominator cannot be zero" } - val gcd = num.abs().gcd(denom.abs()) - val (simplifiedNum, simplifiedDenom) = if (denom >= BigInteger.ZERO) { - num.divide(gcd) to denom.divide(gcd) - } else { - num.divide(gcd).negate() to denom.divide(gcd).negate() - } - return RatLitExpr(simplifiedNum, simplifiedDenom) + val gcd = num.abs().gcd(denom.abs()) + val (simplifiedNum, simplifiedDenom) = + if (denom >= BigInteger.ZERO) { + num.divide(gcd) to denom.divide(gcd) + } else { + num.divide(gcd).negate() to denom.divide(gcd).negate() } + return RatLitExpr(simplifiedNum, simplifiedDenom) } + } - override val type: RatType = Rat() - override fun eval(`val`: Valuation): RatLitExpr = this + override val type: RatType = Rat() - fun sign(): Int = num.signum() - fun floor(): BigInteger = - if (num >= BigInteger.ZERO || num.mod(denom) == BigInteger.ZERO) num / denom - else num / denom - BigInteger.ONE + override fun eval(`val`: Valuation): RatLitExpr = this - fun ceil(): BigInteger = - if (num <= BigInteger.ZERO || num.mod(denom) == BigInteger.ZERO) num / denom - else num / denom + BigInteger.ONE + fun sign(): Int = num.signum() - fun add(that: RatLitExpr) = - of(this.num * that.denom + this.denom * that.num, this.denom * that.denom) + fun floor(): BigInteger = + if (num >= BigInteger.ZERO || num.mod(denom) == BigInteger.ZERO) num / denom + else num / denom - BigInteger.ONE - fun sub(that: RatLitExpr) = - of(this.num * that.denom - this.denom * that.num, this.denom * that.denom) + fun ceil(): BigInteger = + if (num <= BigInteger.ZERO || num.mod(denom) == BigInteger.ZERO) num / denom + else num / denom + BigInteger.ONE - fun pos() = of(this.num, this.denom) - fun neg() = of(this.num.negate(), this.denom) - fun mul(that: RatLitExpr) = - of(this.num * that.num, this.denom * that.denom) + fun add(that: RatLitExpr) = + of(this.num * that.denom + this.denom * that.num, this.denom * that.denom) - fun div(that: RatLitExpr) = - of(this.num * that.denom, this.denom * that.num) + fun sub(that: RatLitExpr) = + of(this.num * that.denom - this.denom * that.num, this.denom * that.denom) - fun eq(that: RatLitExpr) = Bool(this.num == that.num && this.denom == that.denom) - fun neq(that: RatLitExpr) = Bool(this.num != that.num || this.denom != that.denom) - fun lt(that: RatLitExpr) = Bool(this.num * that.denom < this.denom * that.num) - fun leq(that: RatLitExpr) = Bool(this.num * that.denom <= this.denom * that.num) - fun gt(that: RatLitExpr) = Bool(this.num * that.denom > this.denom * that.num) - fun geq(that: RatLitExpr) = Bool(this.num * that.denom >= this.denom * that.num) - fun abs(): RatLitExpr = of(num.abs(), denom) - fun frac(): RatLitExpr = sub(of(floor(), BigInteger.ONE)) + fun pos() = of(this.num, this.denom) - override fun compareTo(other: RatLitExpr): Int = - (this.num * other.denom).compareTo(this.denom * other.num) + fun neg() = of(this.num.negate(), this.denom) - fun toInt(): IntLitExpr = IntLitExpr(num.divide(denom)) + fun mul(that: RatLitExpr) = of(this.num * that.num, this.denom * that.denom) - override fun toString(): String = "$num%$denom" -} + fun div(that: RatLitExpr) = of(this.num * that.denom, this.denom * that.num) + + fun eq(that: RatLitExpr) = Bool(this.num == that.num && this.denom == that.denom) + + fun neq(that: RatLitExpr) = Bool(this.num != that.num || this.denom != that.denom) + + fun lt(that: RatLitExpr) = Bool(this.num * that.denom < this.denom * that.num) + fun leq(that: RatLitExpr) = Bool(this.num * that.denom <= this.denom * that.num) + + fun gt(that: RatLitExpr) = Bool(this.num * that.denom > this.denom * that.num) + + fun geq(that: RatLitExpr) = Bool(this.num * that.denom >= this.denom * that.num) + + fun abs(): RatLitExpr = of(num.abs(), denom) + + fun frac(): RatLitExpr = sub(of(floor(), BigInteger.ONE)) + + override fun compareTo(other: RatLitExpr): Int = + (this.num * other.denom).compareTo(this.denom * other.num) + + fun toInt(): IntLitExpr = IntLitExpr(num.divide(denom)) + + override fun toString(): String = "$num%$denom" +} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatLtExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatLtExpr.kt index d4a057964c..fcdea03c30 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatLtExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatLtExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.rattype import hu.bme.mit.theta.core.model.Valuation @@ -27,29 +26,25 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("RatLt") -data class RatLtExpr( - override val leftOp: Expr, - override val rightOp: Expr -) : LtExpr() { +data class RatLtExpr(override val leftOp: Expr, override val rightOp: Expr) : + LtExpr() { - companion object { + companion object { - @JvmStatic - fun of(leftOp: Expr, rightOp: Expr) = RatLtExpr(leftOp, rightOp) + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = RatLtExpr(leftOp, rightOp) - @JvmStatic - fun create(leftOp: Expr<*>, rightOp: Expr<*>) = RatLtExpr(cast(leftOp, Rat()), cast(rightOp, Rat())) - } + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + RatLtExpr(cast(leftOp, Rat()), cast(rightOp, Rat())) + } - override fun eval(`val`: Valuation): BoolLitExpr { - val leftOpVal = leftOp.eval(`val`) as RatLitExpr - val rightOpVal = rightOp.eval(`val`) as RatLitExpr - return leftOpVal.lt(rightOpVal) - } + override fun eval(`val`: Valuation): BoolLitExpr { + val leftOpVal = leftOp.eval(`val`) as RatLitExpr + val rightOpVal = rightOp.eval(`val`) as RatLitExpr + return leftOpVal.lt(rightOpVal) + } - override fun new(leftOp: Expr, rightOp: Expr): RatLtExpr = - of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): RatLtExpr = of(leftOp, rightOp) - override fun toString(): String = super.toString() + override fun toString(): String = super.toString() } - diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatMulExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatMulExpr.kt index 27236bece4..571c10bf8c 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatMulExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatMulExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.rattype import hu.bme.mit.theta.core.model.Valuation @@ -21,43 +20,40 @@ import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.abstracttype.MulExpr import hu.bme.mit.theta.core.type.rattype.RatExprs.Rat import hu.bme.mit.theta.core.utils.TypeUtils.cast +import java.math.BigInteger import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import java.math.BigInteger @Serializable @SerialName("RatMul") -data class RatMulExpr( - override val ops: List> -) : MulExpr() { +data class RatMulExpr(override val ops: List>) : MulExpr() { - companion object { + companion object { - private const val OPERATOR_LABEL = "*" + private const val OPERATOR_LABEL = "*" - @JvmStatic - fun of(ops: Iterable>) = RatMulExpr(ops.toList()) + @JvmStatic fun of(ops: Iterable>) = RatMulExpr(ops.toList()) - @JvmStatic - fun create(ops: List>) = RatMulExpr(ops.map { cast(it, Rat()) }) - } + @JvmStatic fun create(ops: List>) = RatMulExpr(ops.map { cast(it, Rat()) }) + } - override val type: RatType = Rat() - override fun eval(`val`: Valuation): RatLitExpr { - var prodNum = BigInteger.ONE - var prodDenom = BigInteger.ONE - ops.forEach { op -> - val opVal = op.eval(`val`) as RatLitExpr - prodNum *= opVal.num - prodDenom *= opVal.denom - } - return Rat(prodNum, prodDenom) + override val type: RatType = Rat() + + override fun eval(`val`: Valuation): RatLitExpr { + var prodNum = BigInteger.ONE + var prodDenom = BigInteger.ONE + ops.forEach { op -> + val opVal = op.eval(`val`) as RatLitExpr + prodNum *= opVal.num + prodDenom *= opVal.denom } + return Rat(prodNum, prodDenom) + } - override fun new(ops: List>): RatMulExpr = - of(ops) + override fun new(ops: List>): RatMulExpr = of(ops) - override val operatorLabel: String get() = OPERATOR_LABEL - override fun toString(): String = super.toString() -} + override val operatorLabel: String + get() = OPERATOR_LABEL + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatNegExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatNegExpr.kt index 9f5a1f58ba..302231f422 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatNegExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatNegExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.rattype import hu.bme.mit.theta.core.model.Valuation @@ -26,26 +25,27 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("RatNeg") -data class RatNegExpr( - override val op: Expr -) : NegExpr() { - - companion object { - private const val OPERATOR_LABEL = "-" - @JvmStatic - fun of(op: Expr) = RatNegExpr(op) - @JvmStatic - fun create(op: Expr<*>) = RatNegExpr(cast(op, Rat())) - } - - override val type: RatType = Rat() - override fun eval(`val`: Valuation): RatLitExpr { - val opVal = op.eval(`val`) as RatLitExpr - return opVal.neg() - } - - override fun new(op: Expr): RatNegExpr = of(op) - override val operatorLabel: String get() = OPERATOR_LABEL - override fun toString(): String = super.toString() -} +data class RatNegExpr(override val op: Expr) : NegExpr() { + + companion object { + private const val OPERATOR_LABEL = "-" + + @JvmStatic fun of(op: Expr) = RatNegExpr(op) + + @JvmStatic fun create(op: Expr<*>) = RatNegExpr(cast(op, Rat())) + } + override val type: RatType = Rat() + + override fun eval(`val`: Valuation): RatLitExpr { + val opVal = op.eval(`val`) as RatLitExpr + return opVal.neg() + } + + override fun new(op: Expr): RatNegExpr = of(op) + + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatNeqExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatNeqExpr.kt index 6f6402340b..14a348220f 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatNeqExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatNeqExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.rattype import hu.bme.mit.theta.core.model.Valuation @@ -27,29 +26,25 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("RatNeq") -data class RatNeqExpr( - override val leftOp: Expr, - override val rightOp: Expr -) : NeqExpr() { +data class RatNeqExpr(override val leftOp: Expr, override val rightOp: Expr) : + NeqExpr() { - companion object { + companion object { - @JvmStatic - fun of(leftOp: Expr, rightOp: Expr) = RatNeqExpr(leftOp, rightOp) + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = RatNeqExpr(leftOp, rightOp) - @JvmStatic - fun create(leftOp: Expr<*>, rightOp: Expr<*>) = RatNeqExpr(cast(leftOp, Rat()), cast(rightOp, Rat())) - } + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + RatNeqExpr(cast(leftOp, Rat()), cast(rightOp, Rat())) + } - override fun eval(`val`: Valuation): BoolLitExpr { - val leftOpVal = leftOp.eval(`val`) as RatLitExpr - val rightOpVal = rightOp.eval(`val`) as RatLitExpr - return leftOpVal.neq(rightOpVal) - } + override fun eval(`val`: Valuation): BoolLitExpr { + val leftOpVal = leftOp.eval(`val`) as RatLitExpr + val rightOpVal = rightOp.eval(`val`) as RatLitExpr + return leftOpVal.neq(rightOpVal) + } - override fun new(leftOp: Expr, rightOp: Expr): RatNeqExpr = - of(leftOp, rightOp) + override fun new(leftOp: Expr, rightOp: Expr): RatNeqExpr = of(leftOp, rightOp) - override fun toString(): String = super.toString() + override fun toString(): String = super.toString() } - diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatPosExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatPosExpr.kt index bb4fed6d97..f7464b0b44 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatPosExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatPosExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.rattype import hu.bme.mit.theta.core.model.Valuation @@ -26,26 +25,27 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("RatPos") -data class RatPosExpr( - override val op: Expr -) : PosExpr() { - - companion object { - private const val OPERATOR_LABEL = "+" - @JvmStatic - fun of(op: Expr) = RatPosExpr(op) - @JvmStatic - fun create(op: Expr<*>) = RatPosExpr(cast(op, Rat())) - } - - override val type: RatType = Rat() - override fun eval(`val`: Valuation): RatLitExpr { - val opVal = op.eval(`val`) as RatLitExpr - return opVal.pos() - } - - override fun new(op: Expr): RatPosExpr = of(op) - override val operatorLabel: String get() = OPERATOR_LABEL - override fun toString(): String = super.toString() -} +data class RatPosExpr(override val op: Expr) : PosExpr() { + + companion object { + private const val OPERATOR_LABEL = "+" + + @JvmStatic fun of(op: Expr) = RatPosExpr(op) + + @JvmStatic fun create(op: Expr<*>) = RatPosExpr(cast(op, Rat())) + } + override val type: RatType = Rat() + + override fun eval(`val`: Valuation): RatLitExpr { + val opVal = op.eval(`val`) as RatLitExpr + return opVal.pos() + } + + override fun new(op: Expr): RatPosExpr = of(op) + + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatSubExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatSubExpr.kt index 299db5d7a3..695686b34e 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatSubExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatSubExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.rattype import hu.bme.mit.theta.core.model.Valuation @@ -26,31 +25,31 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("RatSub") -data class RatSubExpr( - override val leftOp: Expr, - override val rightOp: Expr -) : SubExpr() { - - companion object { - private const val OPERATOR_LABEL = "-" - @JvmStatic - fun of(leftOp: Expr, rightOp: Expr) = RatSubExpr(leftOp, rightOp) - @JvmStatic - fun create(leftOp: Expr<*>, rightOp: Expr<*>) = RatSubExpr(cast(leftOp, Rat()), cast(rightOp, Rat())) - } - - override val type: RatType = Rat() - override fun eval(`val`: Valuation): RatLitExpr { - val leftOpVal = leftOp.eval(`val`) as RatLitExpr - val rightOpVal = rightOp.eval(`val`) as RatLitExpr - return leftOpVal.sub(rightOpVal) - } - - override fun new(leftOp: Expr, rightOp: Expr): RatSubExpr = - of(leftOp, rightOp) - - override val operatorLabel: String get() = OPERATOR_LABEL - - override fun toString(): String = super.toString() -} +data class RatSubExpr(override val leftOp: Expr, override val rightOp: Expr) : + SubExpr() { + + companion object { + private const val OPERATOR_LABEL = "-" + + @JvmStatic fun of(leftOp: Expr, rightOp: Expr) = RatSubExpr(leftOp, rightOp) + + @JvmStatic + fun create(leftOp: Expr<*>, rightOp: Expr<*>) = + RatSubExpr(cast(leftOp, Rat()), cast(rightOp, Rat())) + } + override val type: RatType = Rat() + + override fun eval(`val`: Valuation): RatLitExpr { + val leftOpVal = leftOp.eval(`val`) as RatLitExpr + val rightOpVal = rightOp.eval(`val`) as RatLitExpr + return leftOpVal.sub(rightOpVal) + } + + override fun new(leftOp: Expr, rightOp: Expr): RatSubExpr = of(leftOp, rightOp) + + override val operatorLabel: String + get() = OPERATOR_LABEL + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatToIntExpr.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatToIntExpr.kt index 2965f60ae7..9994306a49 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatToIntExpr.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatToIntExpr.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.type.rattype import hu.bme.mit.theta.core.model.Valuation @@ -29,29 +28,27 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("RatToInt") -data class RatToIntExpr( - override val op: Expr -) : UnaryExpr() { +data class RatToIntExpr(override val op: Expr) : UnaryExpr() { - companion object { + companion object { - private const val OPERATOR_LABEL = "to_int" + private const val OPERATOR_LABEL = "to_int" - @JvmStatic - fun of(op: Expr) = RatToIntExpr(op) + @JvmStatic fun of(op: Expr) = RatToIntExpr(op) - @JvmStatic - fun create(op: Expr<*>) = RatToIntExpr(cast(op, Rat())) - } + @JvmStatic fun create(op: Expr<*>) = RatToIntExpr(cast(op, Rat())) + } - override val type: IntType = Int() - override val operatorLabel: String get() = OPERATOR_LABEL - override fun eval(`val`: Valuation): IntLitExpr { - val opVal = op.eval(`val`) as RatLitExpr - return opVal.toInt() - } + override val type: IntType = Int() + override val operatorLabel: String + get() = OPERATOR_LABEL - override fun new(op: Expr): RatToIntExpr = of(op) - override fun toString(): String = super.toString() -} + override fun eval(`val`: Valuation): IntLitExpr { + val opVal = op.eval(`val`) as RatLitExpr + return opVal.toInt() + } + override fun new(op: Expr): RatToIntExpr = of(op) + + override fun toString(): String = super.toString() +} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatType.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatType.kt index 67191fc115..c0b146951b 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatType.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatType.kt @@ -1,4 +1,18 @@ - +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package hu.bme.mit.theta.core.type.rattype import hu.bme.mit.theta.core.type.DomainSize @@ -13,24 +27,37 @@ import kotlinx.serialization.Serializable @Serializable @SerialName(RatType.TYPE_LABEL) -object RatType : Additive, Multiplicative, Equational, Ordered, Type { - internal const val TYPE_LABEL = "Rat" - @JvmStatic - fun getInstance(): RatType = this - override fun toString(): String = TYPE_LABEL - - override fun Add(ops: Iterable>) = RatAddExpr.of(ops) - override fun Sub(leftOp: Expr, rightOp: Expr) = RatSubExpr(leftOp, rightOp) - override fun Pos(op: Expr) = RatPosExpr(op) - override fun Neg(op: Expr) = RatNegExpr(op) - override fun Mul(ops: Iterable>) = RatMulExpr.of(ops) - override fun Div(leftOp: Expr, rightOp: Expr) = RatDivExpr(leftOp, rightOp) - override fun Eq(leftOp: Expr, rightOp: Expr) = RatEqExpr(leftOp, rightOp) - override fun Neq(leftOp: Expr, rightOp: Expr) = RatNeqExpr(leftOp, rightOp) - override fun Lt(leftOp: Expr, rightOp: Expr) = RatLtExpr(leftOp, rightOp) - override fun Leq(leftOp: Expr, rightOp: Expr) = RatLeqExpr(leftOp, rightOp) - override fun Gt(leftOp: Expr, rightOp: Expr) = RatGtExpr(leftOp, rightOp) - override fun Geq(leftOp: Expr, rightOp: Expr) = RatGeqExpr(leftOp, rightOp) - - override val domainSize: DomainSize = DomainSize.INFINITY +object RatType : + Additive, Multiplicative, Equational, Ordered, Type { + internal const val TYPE_LABEL = "Rat" + + @JvmStatic fun getInstance(): RatType = this + + override fun toString(): String = TYPE_LABEL + + override fun Add(ops: Iterable>) = RatAddExpr.of(ops) + + override fun Sub(leftOp: Expr, rightOp: Expr) = RatSubExpr(leftOp, rightOp) + + override fun Pos(op: Expr) = RatPosExpr(op) + + override fun Neg(op: Expr) = RatNegExpr(op) + + override fun Mul(ops: Iterable>) = RatMulExpr.of(ops) + + override fun Div(leftOp: Expr, rightOp: Expr) = RatDivExpr(leftOp, rightOp) + + override fun Eq(leftOp: Expr, rightOp: Expr) = RatEqExpr(leftOp, rightOp) + + override fun Neq(leftOp: Expr, rightOp: Expr) = RatNeqExpr(leftOp, rightOp) + + override fun Lt(leftOp: Expr, rightOp: Expr) = RatLtExpr(leftOp, rightOp) + + override fun Leq(leftOp: Expr, rightOp: Expr) = RatLeqExpr(leftOp, rightOp) + + override fun Gt(leftOp: Expr, rightOp: Expr) = RatGtExpr(leftOp, rightOp) + + override fun Geq(leftOp: Expr, rightOp: Expr) = RatGeqExpr(leftOp, rightOp) + + override val domainSize: DomainSize = DomainSize.INFINITY } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/utils/ExprSimplifier.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/utils/ExprSimplifier.java index 980bd67d23..c6700388a4 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/utils/ExprSimplifier.java +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/utils/ExprSimplifier.java @@ -22,7 +22,6 @@ import static hu.bme.mit.theta.core.utils.SimplifierLevel.LITERAL_ONLY; import hu.bme.mit.theta.common.DispatchTable2; -import hu.bme.mit.theta.common.Tuple2; import hu.bme.mit.theta.common.Utils; import hu.bme.mit.theta.common.container.Containers; import hu.bme.mit.theta.core.model.Valuation; @@ -48,7 +47,6 @@ import hu.bme.mit.theta.core.type.rattype.*; import java.math.BigInteger; import java.util.*; - import kotlin.Pair; import org.kframework.mpfr.BigFloat; diff --git a/subprojects/common/core/src/testFixtures/java/hu/bme/mit/theta/core/utils/ArrayTestUtils.java b/subprojects/common/core/src/testFixtures/java/hu/bme/mit/theta/core/utils/ArrayTestUtils.java index 5387107e0e..c80c6db5d9 100644 --- a/subprojects/common/core/src/testFixtures/java/hu/bme/mit/theta/core/utils/ArrayTestUtils.java +++ b/subprojects/common/core/src/testFixtures/java/hu/bme/mit/theta/core/utils/ArrayTestUtils.java @@ -15,18 +15,17 @@ */ package hu.bme.mit.theta.core.utils; -import hu.bme.mit.theta.core.type.arraytype.*; -import kotlin.Pair; - -import java.util.Arrays; -import java.util.Collection; -import java.util.List; - import static hu.bme.mit.theta.core.decl.Decls.Const; import static hu.bme.mit.theta.core.type.booltype.BoolExprs.False; import static hu.bme.mit.theta.core.type.booltype.BoolExprs.True; import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; +import hu.bme.mit.theta.core.type.arraytype.*; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; +import kotlin.Pair; + public class ArrayTestUtils { private ArrayTestUtils() {} diff --git a/subprojects/common/grammar/src/main/java/hu/bme/mit/theta/grammar/dsl/expr/ExprParser.kt b/subprojects/common/grammar/src/main/java/hu/bme/mit/theta/grammar/dsl/expr/ExprParser.kt index 16efd77f08..ef5364b5e8 100644 --- a/subprojects/common/grammar/src/main/java/hu/bme/mit/theta/grammar/dsl/expr/ExprParser.kt +++ b/subprojects/common/grammar/src/main/java/hu/bme/mit/theta/grammar/dsl/expr/ExprParser.kt @@ -48,7 +48,6 @@ import hu.bme.mit.theta.core.type.fptype.FpLitExpr import hu.bme.mit.theta.core.type.fptype.FpRoundingMode import hu.bme.mit.theta.core.type.fptype.FpType import hu.bme.mit.theta.core.type.functype.FuncExprs -import hu.bme.mit.theta.core.type.inttype.IntExprs import hu.bme.mit.theta.core.type.inttype.IntExprs.Int import hu.bme.mit.theta.core.type.inttype.IntLitExpr import hu.bme.mit.theta.core.type.rattype.RatExprs @@ -166,10 +165,8 @@ class ExpressionWrapper(scope: Scope, content: String) { override fun visitIffExpr(ctx: IffExprContext): Expr { return if (ctx.rightOp != null) { - val leftOp: Expr = - cast(ctx.leftOp.accept>(this), BoolExprs.Bool()) - val rightOp: Expr = - cast(ctx.rightOp.accept>(this), BoolExprs.Bool()) + val leftOp: Expr = cast(ctx.leftOp.accept>(this), BoolExprs.Bool()) + val rightOp: Expr = cast(ctx.rightOp.accept>(this), BoolExprs.Bool()) BoolExprs.Iff(leftOp, rightOp) } else { visitChildren(ctx) @@ -178,10 +175,8 @@ class ExpressionWrapper(scope: Scope, content: String) { override fun visitImplyExpr(ctx: ImplyExprContext): Expr { return if (ctx.rightOp != null) { - val leftOp: Expr = - cast(ctx.leftOp.accept>(this), BoolExprs.Bool()) - val rightOp: Expr = - cast(ctx.rightOp.accept>(this), BoolExprs.Bool()) + val leftOp: Expr = cast(ctx.leftOp.accept>(this), BoolExprs.Bool()) + val rightOp: Expr = cast(ctx.rightOp.accept>(this), BoolExprs.Bool()) BoolExprs.Imply(leftOp, rightOp) } else { visitChildren(ctx) @@ -215,9 +210,9 @@ class ExpressionWrapper(scope: Scope, content: String) { override fun visitOrExpr(ctx: OrExprContext): Expr { return if (ctx.ops.size >= 1) { val opStream: Stream> = - ctx.ops - .stream() - .map { op: ExprContext -> cast(op.accept>(this), BoolExprs.Bool()) } + ctx.ops.stream().map { op: ExprContext -> + cast(op.accept>(this), BoolExprs.Bool()) + } val ops: Collection> = opStream.collect(Collectors.toList()) BoolExprs.Or(ops) } else { @@ -227,10 +222,8 @@ class ExpressionWrapper(scope: Scope, content: String) { override fun visitXorExpr(ctx: XorExprContext): Expr { return if (ctx.rightOp != null) { - val leftOp: Expr = - cast(ctx.leftOp.accept>(this), BoolExprs.Bool()) - val rightOp: Expr = - cast(ctx.rightOp.accept>(this), BoolExprs.Bool()) + val leftOp: Expr = cast(ctx.leftOp.accept>(this), BoolExprs.Bool()) + val rightOp: Expr = cast(ctx.rightOp.accept>(this), BoolExprs.Bool()) BoolExprs.Xor(leftOp, rightOp) } else { visitChildren(ctx) @@ -240,9 +233,9 @@ class ExpressionWrapper(scope: Scope, content: String) { override fun visitAndExpr(ctx: AndExprContext): Expr { return if (ctx.ops.size >= 1) { val opStream: Stream> = - ctx.ops - .stream() - .map { op: ExprContext -> cast(op.accept>(this), BoolExprs.Bool()) } + ctx.ops.stream().map { op: ExprContext -> + cast(op.accept>(this), BoolExprs.Bool()) + } val ops: Collection> = opStream.collect(Collectors.toList()) BoolExprs.And(ops) } else { @@ -893,7 +886,7 @@ class ExpressionWrapper(scope: Scope, content: String) { var value = BigInteger(lit) Preconditions.checkArgument( value >= BigInteger.TWO.pow(size - 1).multiply(BigInteger.valueOf(-1)) && - value < BigInteger.TWO.pow(size), + value < BigInteger.TWO.pow(size), "Decimal literal is not in range", ) if (value < BigInteger.ZERO) { diff --git a/subprojects/solver/graph-solver/src/main/java/hu/bme/mit/theta/graphsolver/compilers/pattern2expr/Pattern2ExprCompiler.kt b/subprojects/solver/graph-solver/src/main/java/hu/bme/mit/theta/graphsolver/compilers/pattern2expr/Pattern2ExprCompiler.kt index ad95b6305c..c9d66f3d64 100644 --- a/subprojects/solver/graph-solver/src/main/java/hu/bme/mit/theta/graphsolver/compilers/pattern2expr/Pattern2ExprCompiler.kt +++ b/subprojects/solver/graph-solver/src/main/java/hu/bme/mit/theta/graphsolver/compilers/pattern2expr/Pattern2ExprCompiler.kt @@ -25,9 +25,9 @@ import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.booltype.BoolExprs.And import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool import hu.bme.mit.theta.core.type.booltype.BoolExprs.False +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Iff import hu.bme.mit.theta.core.type.booltype.BoolExprs.Not import hu.bme.mit.theta.core.type.booltype.BoolExprs.Or -import hu.bme.mit.theta.core.type.booltype.BoolExprs.Iff import hu.bme.mit.theta.core.type.booltype.BoolExprs.True import hu.bme.mit.theta.core.type.booltype.BoolType import hu.bme.mit.theta.graphsolver.ThreeVL @@ -221,9 +221,7 @@ class Pattern2ExprCompiler : GraphPatternCompiler, Map> { val opCompiled = pattern.op.accept(this) return events - .map { a -> - events.map { b -> Pair(Tuple2.of(a, b), opCompiled[Tuple2.of(b, a)]!!) } - } + .map { a -> events.map { b -> Pair(Tuple2.of(a, b), opCompiled[Tuple2.of(b, a)]!!) } } .flatten() .toMap() } @@ -361,14 +359,8 @@ class Pattern2ExprCompiler : GraphPatternCompiler, Map a != c && b != c } .map { c -> Or( - And( - opCompiled[Tuple2.of(a, c)]!!, - consts[Tuple2.of(c, b)]!!.ref, - ), - And( - consts[Tuple2.of(a, c)]!!.ref, - opCompiled[Tuple2.of(c, b)]!!, - ), + And(opCompiled[Tuple2.of(a, c)]!!, consts[Tuple2.of(c, b)]!!.ref), + And(consts[Tuple2.of(a, c)]!!.ref, opCompiled[Tuple2.of(c, b)]!!), ) } ), @@ -381,9 +373,7 @@ class Pattern2ExprCompiler : GraphPatternCompiler, Map - events.map { b -> Pair(Tuple2.of(a, b), consts[Tuple2.of(a, b)]!!.ref) } - } + events.map { a -> events.map { b -> Pair(Tuple2.of(a, b), consts[Tuple2.of(a, b)]!!.ref) } } return ret.flatten().toMap() } diff --git a/subprojects/solver/solver-javasmt/src/main/java/hu/bme/mit/theta/solver/javasmt/JavaSMTExprTransformer.java b/subprojects/solver/solver-javasmt/src/main/java/hu/bme/mit/theta/solver/javasmt/JavaSMTExprTransformer.java index 2b935377c9..65e8b1adc3 100644 --- a/subprojects/solver/solver-javasmt/src/main/java/hu/bme/mit/theta/solver/javasmt/JavaSMTExprTransformer.java +++ b/subprojects/solver/solver-javasmt/src/main/java/hu/bme/mit/theta/solver/javasmt/JavaSMTExprTransformer.java @@ -15,6 +15,10 @@ */ package hu.bme.mit.theta.solver.javasmt; +import static com.google.common.base.Preconditions.checkNotNull; +import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; +import static hu.bme.mit.theta.core.utils.ExprUtils.extractFuncAndArgs; + import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import hu.bme.mit.theta.common.DispatchTable; @@ -43,22 +47,17 @@ import hu.bme.mit.theta.core.type.inttype.*; import hu.bme.mit.theta.core.type.rattype.*; import hu.bme.mit.theta.core.utils.BvUtils; -import kotlin.Pair; -import org.sosy_lab.java_smt.api.*; -import org.sosy_lab.java_smt.api.FormulaType.FloatingPointType; -import org.sosy_lab.java_smt.api.NumeralFormula.IntegerFormula; -import org.sosy_lab.java_smt.api.NumeralFormula.RationalFormula; - import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutionException; import java.util.function.Supplier; import java.util.stream.Collectors; import java.util.stream.Stream; - -import static com.google.common.base.Preconditions.checkNotNull; -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; -import static hu.bme.mit.theta.core.utils.ExprUtils.extractFuncAndArgs; +import kotlin.Pair; +import org.sosy_lab.java_smt.api.*; +import org.sosy_lab.java_smt.api.FormulaType.FloatingPointType; +import org.sosy_lab.java_smt.api.NumeralFormula.IntegerFormula; +import org.sosy_lab.java_smt.api.NumeralFormula.RationalFormula; final class JavaSMTExprTransformer { diff --git a/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/generic/GenericSmtLibExprTransformer.java b/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/generic/GenericSmtLibExprTransformer.java index 9c80211e35..9bad932709 100644 --- a/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/generic/GenericSmtLibExprTransformer.java +++ b/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/generic/GenericSmtLibExprTransformer.java @@ -15,6 +15,11 @@ */ package hu.bme.mit.theta.solver.smtlib.impl.generic; +import static com.google.common.base.Preconditions.checkNotNull; +import static hu.bme.mit.theta.core.decl.Decls.Param; +import static hu.bme.mit.theta.core.utils.ExprUtils.extractFuncAndArgs; +import static hu.bme.mit.theta.solver.smtlib.impl.generic.GenericSmtLibSymbolTable.encodeSymbol; + import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import hu.bme.mit.theta.common.DispatchTable; @@ -47,20 +52,14 @@ import hu.bme.mit.theta.solver.smtlib.solver.transformer.SmtLibExprTransformer; import hu.bme.mit.theta.solver.smtlib.solver.transformer.SmtLibSymbolTable; import hu.bme.mit.theta.solver.smtlib.solver.transformer.SmtLibTransformationManager; -import kotlin.Pair; -import org.jetbrains.annotations.NotNull; - import java.math.BigInteger; import java.util.Collection; import java.util.List; import java.util.Map; import java.util.concurrent.ExecutionException; import java.util.stream.Collectors; - -import static com.google.common.base.Preconditions.checkNotNull; -import static hu.bme.mit.theta.core.decl.Decls.Param; -import static hu.bme.mit.theta.core.utils.ExprUtils.extractFuncAndArgs; -import static hu.bme.mit.theta.solver.smtlib.impl.generic.GenericSmtLibSymbolTable.encodeSymbol; +import kotlin.Pair; +import org.jetbrains.annotations.NotNull; public class GenericSmtLibExprTransformer implements SmtLibExprTransformer { @@ -1096,7 +1095,8 @@ protected String transformArrayLit(final ArrayLitExpr expr) { for (Pair, ? extends Expr> elem : expr.getElements()) { running = String.format( - "(store %s %s %s)", running, toTerm(elem.getFirst()), toTerm(elem.getSecond())); + "(store %s %s %s)", + running, toTerm(elem.getFirst()), toTerm(elem.getSecond())); } return running; } @@ -1109,7 +1109,8 @@ protected String transformArrayInit(final ArrayInitExpr expr) { for (Pair, ? extends Expr> elem : expr.getElements()) { running = String.format( - "(store %s %s %s)", running, toTerm(elem.getFirst()), toTerm(elem.getSecond())); + "(store %s %s %s)", + running, toTerm(elem.getFirst()), toTerm(elem.getSecond())); } return running; } diff --git a/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/generic/GenericSmtLibTermTransformer.java b/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/generic/GenericSmtLibTermTransformer.java index 8c50639222..bf24ade586 100644 --- a/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/generic/GenericSmtLibTermTransformer.java +++ b/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/generic/GenericSmtLibTermTransformer.java @@ -20,6 +20,7 @@ import static hu.bme.mit.theta.core.decl.Decls.Const; import static hu.bme.mit.theta.core.decl.Decls.Param; import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.Array; +import static hu.bme.mit.theta.core.type.booltype.BoolExprs.*; import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Exists; import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Forall; @@ -29,6 +30,7 @@ import static hu.bme.mit.theta.core.type.rattype.RatExprs.Rat; import static hu.bme.mit.theta.core.utils.TypeUtils.cast; import static hu.bme.mit.theta.core.utils.TypeUtils.castBv; +import static hu.bme.mit.theta.solver.smtlib.dsl.gen.SMTLIBv2Parser.*; import static hu.bme.mit.theta.solver.smtlib.dsl.gen.SMTLIBv2Parser.BinaryContext; import static hu.bme.mit.theta.solver.smtlib.dsl.gen.SMTLIBv2Parser.DecimalContext; import static hu.bme.mit.theta.solver.smtlib.dsl.gen.SMTLIBv2Parser.Exists_termContext; @@ -84,30 +86,14 @@ import hu.bme.mit.theta.solver.smtlib.solver.parser.ThrowExceptionErrorListener; import hu.bme.mit.theta.solver.smtlib.solver.transformer.SmtLibSymbolTable; import hu.bme.mit.theta.solver.smtlib.solver.transformer.SmtLibTermTransformer; -import kotlin.Pair; -import org.antlr.v4.runtime.CharStreams; -import org.antlr.v4.runtime.CommonTokenStream; - import java.math.BigDecimal; import java.math.BigInteger; import java.util.*; import java.util.function.*; import java.util.stream.Collectors; - -import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.base.Preconditions.checkNotNull; -import static hu.bme.mit.theta.core.decl.Decls.Const; -import static hu.bme.mit.theta.core.decl.Decls.Param; -import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.Array; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.*; -import static hu.bme.mit.theta.core.type.functype.FuncExprs.Func; -import static hu.bme.mit.theta.core.type.functype.FuncExprs.UnsafeApp; -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; -import static hu.bme.mit.theta.core.type.rattype.RatExprs.Rat; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; -import static hu.bme.mit.theta.core.utils.TypeUtils.castBv; -import static hu.bme.mit.theta.solver.smtlib.dsl.gen.SMTLIBv2Parser.*; -import static java.util.stream.Collectors.toList; +import kotlin.Pair; +import org.antlr.v4.runtime.CharStreams; +import org.antlr.v4.runtime.CommonTokenStream; public class GenericSmtLibTermTransformer implements SmtLibTermTransformer { diff --git a/subprojects/solver/solver-z3-legacy/src/main/java/hu/bme/mit/theta/solver/z3legacy/Z3ExprTransformer.java b/subprojects/solver/solver-z3-legacy/src/main/java/hu/bme/mit/theta/solver/z3legacy/Z3ExprTransformer.java index 7e8a3c1b58..a2e1912984 100644 --- a/subprojects/solver/solver-z3-legacy/src/main/java/hu/bme/mit/theta/solver/z3legacy/Z3ExprTransformer.java +++ b/subprojects/solver/solver-z3-legacy/src/main/java/hu/bme/mit/theta/solver/z3legacy/Z3ExprTransformer.java @@ -16,7 +16,6 @@ package hu.bme.mit.theta.solver.z3legacy; import static com.google.common.base.Preconditions.checkNotNull; -import static com.google.common.base.Preconditions.checkState; import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; import static hu.bme.mit.theta.core.utils.ExprUtils.extractFuncAndArgs; @@ -48,11 +47,10 @@ import hu.bme.mit.theta.core.type.inttype.*; import hu.bme.mit.theta.core.type.rattype.*; import hu.bme.mit.theta.core.utils.BvUtils; -import kotlin.Pair; - import java.util.List; import java.util.concurrent.ExecutionException; import java.util.stream.Stream; +import kotlin.Pair; final class Z3ExprTransformer { diff --git a/subprojects/solver/solver-z3-legacy/src/main/java/hu/bme/mit/theta/solver/z3legacy/Z3TermTransformer.java b/subprojects/solver/solver-z3-legacy/src/main/java/hu/bme/mit/theta/solver/z3legacy/Z3TermTransformer.java index 448a63ca3c..2825b28b56 100644 --- a/subprojects/solver/solver-z3-legacy/src/main/java/hu/bme/mit/theta/solver/z3legacy/Z3TermTransformer.java +++ b/subprojects/solver/solver-z3-legacy/src/main/java/hu/bme/mit/theta/solver/z3legacy/Z3TermTransformer.java @@ -135,7 +135,6 @@ import java.util.regex.Pattern; import java.util.stream.Collectors; import java.util.stream.Stream; - import kotlin.Pair; import org.kframework.mpfr.BigFloat; diff --git a/subprojects/solver/solver-z3/src/main/java/hu/bme/mit/theta/solver/z3/Z3ExprTransformer.java b/subprojects/solver/solver-z3/src/main/java/hu/bme/mit/theta/solver/z3/Z3ExprTransformer.java index fd821bc99f..6d3eb6de79 100644 --- a/subprojects/solver/solver-z3/src/main/java/hu/bme/mit/theta/solver/z3/Z3ExprTransformer.java +++ b/subprojects/solver/solver-z3/src/main/java/hu/bme/mit/theta/solver/z3/Z3ExprTransformer.java @@ -15,6 +15,8 @@ */ package hu.bme.mit.theta.solver.z3; +import static hu.bme.mit.theta.core.utils.ExprUtils.extractFuncAndArgs; + import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import com.microsoft.z3.*; @@ -44,14 +46,11 @@ import hu.bme.mit.theta.core.type.rattype.*; import hu.bme.mit.theta.core.utils.BvUtils; import hu.bme.mit.theta.core.utils.ExprUtils; -import kotlin.Pair; - import java.util.List; import java.util.Map; import java.util.concurrent.ExecutionException; import java.util.stream.Stream; - -import static hu.bme.mit.theta.core.utils.ExprUtils.extractFuncAndArgs; +import kotlin.Pair; final class Z3ExprTransformer { diff --git a/subprojects/solver/solver-z3/src/main/java/hu/bme/mit/theta/solver/z3/Z3TermTransformer.java b/subprojects/solver/solver-z3/src/main/java/hu/bme/mit/theta/solver/z3/Z3TermTransformer.java index fc884fc16d..9abf1827be 100644 --- a/subprojects/solver/solver-z3/src/main/java/hu/bme/mit/theta/solver/z3/Z3TermTransformer.java +++ b/subprojects/solver/solver-z3/src/main/java/hu/bme/mit/theta/solver/z3/Z3TermTransformer.java @@ -15,6 +15,20 @@ */ package hu.bme.mit.theta.solver.z3; +import static com.google.common.base.Preconditions.*; +import static com.google.common.collect.ImmutableList.toImmutableList; +import static hu.bme.mit.theta.common.Utils.head; +import static hu.bme.mit.theta.common.Utils.tail; +import static hu.bme.mit.theta.core.decl.Decls.Param; +import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.Array; +import static hu.bme.mit.theta.core.type.booltype.BoolExprs.*; +import static hu.bme.mit.theta.core.type.bvtype.BvExprs.BvType; +import static hu.bme.mit.theta.core.type.functype.FuncExprs.Func; +import static hu.bme.mit.theta.core.type.functype.FuncExprs.UnsafeApp; +import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; +import static hu.bme.mit.theta.core.type.rattype.RatExprs.Rat; +import static java.lang.String.format; + import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; import com.microsoft.z3.*; @@ -35,7 +49,6 @@ import hu.bme.mit.theta.core.type.arraytype.ArrayType; import hu.bme.mit.theta.core.type.arraytype.ArrayWriteExpr; import hu.bme.mit.theta.core.type.booltype.*; -import hu.bme.mit.theta.core.type.booltype.*; import hu.bme.mit.theta.core.type.bvtype.*; import hu.bme.mit.theta.core.type.enumtype.EnumLitExpr; import hu.bme.mit.theta.core.type.enumtype.EnumType; @@ -46,9 +59,6 @@ import hu.bme.mit.theta.core.utils.BvUtils; import hu.bme.mit.theta.core.utils.FpUtils; import hu.bme.mit.theta.core.utils.TypeUtils; -import kotlin.Pair; -import org.kframework.mpfr.BigFloat; - import java.math.BigInteger; import java.util.ArrayList; import java.util.Arrays; @@ -59,20 +69,8 @@ import java.util.regex.Pattern; import java.util.stream.Collectors; import java.util.stream.Stream; - -import static com.google.common.base.Preconditions.*; -import static com.google.common.collect.ImmutableList.toImmutableList; -import static hu.bme.mit.theta.common.Utils.head; -import static hu.bme.mit.theta.common.Utils.tail; -import static hu.bme.mit.theta.core.decl.Decls.Param; -import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.Array; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.*; -import static hu.bme.mit.theta.core.type.bvtype.BvExprs.BvType; -import static hu.bme.mit.theta.core.type.functype.FuncExprs.Func; -import static hu.bme.mit.theta.core.type.functype.FuncExprs.UnsafeApp; -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; -import static hu.bme.mit.theta.core.type.rattype.RatExprs.Rat; -import static java.lang.String.format; +import kotlin.Pair; +import org.kframework.mpfr.BigFloat; final class Z3TermTransformer { diff --git a/subprojects/xcfa/c2xcfa/src/main/java/hu/bme/mit/theta/c2xcfa/FrontendXcfaBuilder.kt b/subprojects/xcfa/c2xcfa/src/main/java/hu/bme/mit/theta/c2xcfa/FrontendXcfaBuilder.kt index 2eef6ebca6..02e75fa913 100644 --- a/subprojects/xcfa/c2xcfa/src/main/java/hu/bme/mit/theta/c2xcfa/FrontendXcfaBuilder.kt +++ b/subprojects/xcfa/c2xcfa/src/main/java/hu/bme/mit/theta/c2xcfa/FrontendXcfaBuilder.kt @@ -1018,10 +1018,7 @@ class FrontendXcfaBuilder( } private fun buildWithoutPostStatement(cStatement: CStatement, param: ParamPack): XcfaLocation { - checkState( - cStatement is CCompound, - "Currently only CCompounds have pre- and post statements!", - ) + checkState(cStatement is CCompound, "Currently only CCompounds have pre- and post statements!") val statement = cStatement as CCompound val builder: XcfaProcedureBuilder = param.builder var lastLoc = param.lastLoc @@ -1059,10 +1056,7 @@ class FrontendXcfaBuilder( } private fun buildPostStatement(cStatement: CStatement, param: ParamPack): XcfaLocation { - checkState( - cStatement is CCompound, - "Currently only CCompounds have pre- and post statements!", - ) + checkState(cStatement is CCompound, "Currently only CCompounds have pre- and post statements!") val statement = cStatement as CCompound val builder: XcfaProcedureBuilder = param.builder var lastLoc = param.lastLoc diff --git a/subprojects/xcfa/llvm2xcfa/src/main/java/hu/bme/mit/theta/llvm2xcfa/Utils.java b/subprojects/xcfa/llvm2xcfa/src/main/java/hu/bme/mit/theta/llvm2xcfa/Utils.java index f546f53fe4..130cbdcaf9 100644 --- a/subprojects/xcfa/llvm2xcfa/src/main/java/hu/bme/mit/theta/llvm2xcfa/Utils.java +++ b/subprojects/xcfa/llvm2xcfa/src/main/java/hu/bme/mit/theta/llvm2xcfa/Utils.java @@ -15,6 +15,14 @@ */ package hu.bme.mit.theta.llvm2xcfa; +import static hu.bme.mit.theta.core.decl.Decls.Var; +import static hu.bme.mit.theta.core.stmt.Stmts.Assign; +import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.Array; +import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; +import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; +import static hu.bme.mit.theta.core.type.rattype.RatExprs.Rat; +import static hu.bme.mit.theta.core.utils.TypeUtils.cast; + import hu.bme.mit.theta.common.Tuple2; import hu.bme.mit.theta.core.decl.VarDecl; import hu.bme.mit.theta.core.stmt.Stmt; @@ -36,20 +44,11 @@ import hu.bme.mit.theta.llvm2xcfa.handlers.states.BlockState; import hu.bme.mit.theta.llvm2xcfa.handlers.states.FunctionState; import hu.bme.mit.theta.xcfa.model.*; -import kotlin.Pair; - import java.math.BigInteger; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; - -import static hu.bme.mit.theta.core.decl.Decls.Var; -import static hu.bme.mit.theta.core.stmt.Stmts.Assign; -import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.Array; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; -import static hu.bme.mit.theta.core.type.rattype.RatExprs.Rat; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; +import kotlin.Pair; public class Utils { private static final int doublePrecision = 1 << 8; diff --git a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaToMonolithicExpr.kt b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaToMonolithicExpr.kt index fbef991747..b0663220c7 100644 --- a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaToMonolithicExpr.kt +++ b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/XcfaToMonolithicExpr.kt @@ -56,8 +56,8 @@ import hu.bme.mit.theta.xcfa.model.StmtLabel import hu.bme.mit.theta.xcfa.model.XCFA import hu.bme.mit.theta.xcfa.model.XcfaEdge import hu.bme.mit.theta.xcfa.model.XcfaLocation -import org.kframework.mpfr.BigFloat import java.math.BigInteger +import org.kframework.mpfr.BigFloat private val LitExpr<*>.value: Int get() = diff --git a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/oc/XcfaOcChecker.kt b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/oc/XcfaOcChecker.kt index 6b81c6d007..b690645615 100644 --- a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/oc/XcfaOcChecker.kt +++ b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/oc/XcfaOcChecker.kt @@ -37,9 +37,9 @@ import hu.bme.mit.theta.core.stmt.HavocStmt import hu.bme.mit.theta.core.stmt.MemoryAssignStmt import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.Type +import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Eq import hu.bme.mit.theta.core.type.anytype.Dereference import hu.bme.mit.theta.core.type.anytype.RefExpr -import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Eq import hu.bme.mit.theta.core.type.booltype.BoolExprs.And import hu.bme.mit.theta.core.type.booltype.BoolExprs.Imply import hu.bme.mit.theta.core.type.booltype.BoolExprs.Not @@ -494,7 +494,11 @@ class XcfaOcChecker( And(rel.from.guardExpr, rel.to.guardExpr, Eq(rel.from.const.ref, rel.to.const.ref)) if (v == memoryDecl) { conseq = - And(conseq, Eq(rel.from.array!!, rel.to.array!!), Eq(rel.from.offset!!, rel.to.offset!!)) + And( + conseq, + Eq(rel.from.array!!, rel.to.array!!), + Eq(rel.from.offset!!, rel.to.offset!!), + ) } solver.add(Imply(rel.declRef, conseq)) // RF-Val } diff --git a/subprojects/xsts/xsts/src/main/java/hu/bme/mit/theta/xsts/dsl/XstsExpression.java b/subprojects/xsts/xsts/src/main/java/hu/bme/mit/theta/xsts/dsl/XstsExpression.java index dcb7151344..ca511cc7f9 100644 --- a/subprojects/xsts/xsts/src/main/java/hu/bme/mit/theta/xsts/dsl/XstsExpression.java +++ b/subprojects/xsts/xsts/src/main/java/hu/bme/mit/theta/xsts/dsl/XstsExpression.java @@ -15,6 +15,21 @@ */ package hu.bme.mit.theta.xsts.dsl; +import static com.google.common.base.Preconditions.checkArgument; +import static com.google.common.base.Preconditions.checkNotNull; +import static hu.bme.mit.theta.common.Utils.head; +import static hu.bme.mit.theta.common.Utils.tail; +import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.*; +import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Eq; +import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Neq; +import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.*; +import static hu.bme.mit.theta.core.type.booltype.BoolExprs.*; +import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; +import static hu.bme.mit.theta.core.utils.ExprUtils.simplify; +import static hu.bme.mit.theta.core.utils.TypeUtils.cast; +import static hu.bme.mit.theta.xsts.dsl.gen.XstsDslParser.*; +import static java.util.stream.Collectors.toList; + import com.google.common.collect.ImmutableList; import hu.bme.mit.theta.common.dsl.DynamicScope; import hu.bme.mit.theta.common.dsl.Env; @@ -33,9 +48,6 @@ import hu.bme.mit.theta.core.type.enumtype.EnumType; import hu.bme.mit.theta.core.type.inttype.IntLitExpr; import hu.bme.mit.theta.xsts.dsl.gen.XstsDslBaseVisitor; -import kotlin.Pair; -import org.antlr.v4.runtime.Token; - import java.math.BigInteger; import java.util.Collection; import java.util.List; @@ -43,21 +55,8 @@ import java.util.stream.Collectors; import java.util.stream.IntStream; import java.util.stream.Stream; - -import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.base.Preconditions.checkNotNull; -import static hu.bme.mit.theta.common.Utils.head; -import static hu.bme.mit.theta.common.Utils.tail; -import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.*; -import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Eq; -import static hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Neq; -import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.*; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.*; -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; -import static hu.bme.mit.theta.core.utils.ExprUtils.simplify; -import static hu.bme.mit.theta.core.utils.TypeUtils.cast; -import static hu.bme.mit.theta.xsts.dsl.gen.XstsDslParser.*; -import static java.util.stream.Collectors.toList; +import kotlin.Pair; +import org.antlr.v4.runtime.Token; final class XstsExpression { From 2890592cfedab36ff7de4cd163f1d6aa7e5680b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Csan=C3=A1d=20Telbisz?= Date: Wed, 25 Jun 2025 09:03:20 +0200 Subject: [PATCH 27/48] small fixes --- .../mit/theta/core/type/booltype/BoolExprs.kt | 4 +- .../core/type/booltype/SmartBoolExprs.kt | 4 +- .../mit/theta/core/type/inttype/IntExprs.kt | 4 +- .../mit/theta/core/type/rattype/RatExprs.kt | 4 +- .../mit/theta/core/expr/EvaluationTest.java | 67 ++++++--------- .../theta/core/utils/ExprCanonizerTest.java | 47 ++++++----- .../theta/core/utils/ExprSimplifierTest.java | 83 ++++++++----------- 7 files changed, 97 insertions(+), 116 deletions(-) diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/BoolExprs.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/BoolExprs.kt index 62884d9788..cae4868e06 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/BoolExprs.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/BoolExprs.kt @@ -49,7 +49,7 @@ object BoolExprs { fun Exists(paramDecls: Iterable>, op: Expr) = ExistsExpr.of(paramDecls, op) // Convenience methods - @JvmStatic fun And(vararg ops: Expr) = AndExpr.of(ops.asList()) + @JvmStatic @SafeVarargs fun And(vararg ops: Expr) = AndExpr.of(ops.asList()) - @JvmStatic fun Or(vararg ops: Expr) = OrExpr.of(ops.asList()) + @JvmStatic @SafeVarargs fun Or(vararg ops: Expr) = OrExpr.of(ops.asList()) } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/SmartBoolExprs.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/SmartBoolExprs.kt index 3abdee8513..04bb299520 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/SmartBoolExprs.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/SmartBoolExprs.kt @@ -65,7 +65,7 @@ object SmartBoolExprs { } // Convenience methods - @JvmStatic fun And(vararg ops: Expr) = And(ops.toList()) + @JvmStatic @SafeVarargs fun And(vararg ops: Expr) = And(ops.toList()) - @JvmStatic fun Or(vararg ops: Expr) = Or(ops.toList()) + @JvmStatic @SafeVarargs fun Or(vararg ops: Expr) = Or(ops.toList()) } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntExprs.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntExprs.kt index 5d45916453..cae694e32b 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntExprs.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntExprs.kt @@ -33,7 +33,7 @@ object IntExprs { @JvmStatic fun Add(ops: Iterable>) = IntAddExpr.of(ops) - @JvmStatic fun Add(vararg ops: Expr) = IntAddExpr(ops.asList()) + @JvmStatic @SafeVarargs fun Add(vararg ops: Expr) = IntAddExpr(ops.asList()) @JvmStatic fun Sub(leftOp: Expr, rightOp: Expr) = IntSubExpr(leftOp, rightOp) @@ -43,7 +43,7 @@ object IntExprs { @JvmStatic fun Mul(ops: Iterable>) = IntMulExpr.of(ops) - @JvmStatic fun Mul(vararg ops: Expr) = IntMulExpr(ops.asList()) + @JvmStatic @SafeVarargs fun Mul(vararg ops: Expr) = IntMulExpr(ops.asList()) @JvmStatic fun Div(leftOp: Expr, rightOp: Expr) = IntDivExpr(leftOp, rightOp) diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatExprs.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatExprs.kt index 10b7e2a876..8377ab4ebe 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatExprs.kt +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatExprs.kt @@ -71,9 +71,9 @@ object RatExprs { @JvmStatic fun Geq(leftOp: Expr, rightOp: Expr) = RatGeqExpr(leftOp, rightOp) - @JvmStatic fun Add(vararg ops: Expr) = RatAddExpr(ops.asList()) + @JvmStatic @SafeVarargs fun Add(vararg ops: Expr) = RatAddExpr(ops.asList()) - @JvmStatic fun Mul(vararg ops: Expr) = RatMulExpr(ops.asList()) + @JvmStatic @SafeVarargs fun Mul(vararg ops: Expr) = RatMulExpr(ops.asList()) @JvmStatic fun ToInt(op: Expr) = RatToIntExpr.of(op) } diff --git a/subprojects/common/core/src/test/java/hu/bme/mit/theta/core/expr/EvaluationTest.java b/subprojects/common/core/src/test/java/hu/bme/mit/theta/core/expr/EvaluationTest.java index eaa8a331bb..7df3679af7 100644 --- a/subprojects/common/core/src/test/java/hu/bme/mit/theta/core/expr/EvaluationTest.java +++ b/subprojects/common/core/src/test/java/hu/bme/mit/theta/core/expr/EvaluationTest.java @@ -15,36 +15,37 @@ */ package hu.bme.mit.theta.core.expr; +import hu.bme.mit.theta.core.decl.ConstDecl; +import hu.bme.mit.theta.core.decl.VarDecl; +import hu.bme.mit.theta.core.model.ImmutableValuation; +import hu.bme.mit.theta.core.model.Valuation; +import hu.bme.mit.theta.core.type.Expr; +import hu.bme.mit.theta.core.type.LitExpr; +import hu.bme.mit.theta.core.type.Type; +import hu.bme.mit.theta.core.type.inttype.IntType; +import kotlin.Pair; +import org.junit.Test; + +import java.util.ArrayList; + import static hu.bme.mit.theta.core.decl.Decls.Const; import static hu.bme.mit.theta.core.decl.Decls.Var; import static hu.bme.mit.theta.core.type.anytype.Exprs.Ite; -import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.Array; -import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.ArrayInit; -import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.Read; -import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.Write; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.And; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.False; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Iff; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Imply; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Not; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Or; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.True; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Xor; +import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.*; +import static hu.bme.mit.theta.core.type.booltype.BoolExprs.*; +import static hu.bme.mit.theta.core.type.inttype.IntExprs.*; import static hu.bme.mit.theta.core.type.inttype.IntExprs.Add; import static hu.bme.mit.theta.core.type.inttype.IntExprs.Div; import static hu.bme.mit.theta.core.type.inttype.IntExprs.Eq; import static hu.bme.mit.theta.core.type.inttype.IntExprs.Geq; import static hu.bme.mit.theta.core.type.inttype.IntExprs.Gt; -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; import static hu.bme.mit.theta.core.type.inttype.IntExprs.Leq; import static hu.bme.mit.theta.core.type.inttype.IntExprs.Lt; -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Mod; import static hu.bme.mit.theta.core.type.inttype.IntExprs.Mul; import static hu.bme.mit.theta.core.type.inttype.IntExprs.Neg; import static hu.bme.mit.theta.core.type.inttype.IntExprs.Neq; -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Rem; import static hu.bme.mit.theta.core.type.inttype.IntExprs.Sub; -import static hu.bme.mit.theta.core.type.inttype.IntExprs.ToRat; +import static hu.bme.mit.theta.core.type.rattype.RatExprs.*; import static hu.bme.mit.theta.core.type.rattype.RatExprs.Add; import static hu.bme.mit.theta.core.type.rattype.RatExprs.Div; import static hu.bme.mit.theta.core.type.rattype.RatExprs.Eq; @@ -55,23 +56,9 @@ import static hu.bme.mit.theta.core.type.rattype.RatExprs.Mul; import static hu.bme.mit.theta.core.type.rattype.RatExprs.Neg; import static hu.bme.mit.theta.core.type.rattype.RatExprs.Neq; -import static hu.bme.mit.theta.core.type.rattype.RatExprs.Rat; import static hu.bme.mit.theta.core.type.rattype.RatExprs.Sub; -import static hu.bme.mit.theta.core.type.rattype.RatExprs.ToInt; import static org.junit.Assert.assertEquals; -import hu.bme.mit.theta.common.Tuple2; -import hu.bme.mit.theta.core.decl.ConstDecl; -import hu.bme.mit.theta.core.decl.VarDecl; -import hu.bme.mit.theta.core.model.ImmutableValuation; -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.type.Type; -import hu.bme.mit.theta.core.type.inttype.IntType; -import java.util.ArrayList; -import org.junit.Test; - public class EvaluationTest { private final ConstDecl ca = Const("a", Int()); @@ -369,9 +356,9 @@ public void testRatSub() { @Test public void testRead() { - var elems = new ArrayList, ? extends Expr>>(); - elems.add(Tuple2.of(Int(0), Int(1))); - elems.add(Tuple2.of(Int(1), Int(2))); + var elems = new ArrayList, ? extends Expr>>(); + elems.add(new Pair<>(Int(0), Int(1))); + elems.add(new Pair<>(Int(1), Int(2))); var arr = Array(elems, Int(100), Array(Int(), Int())); assertEquals(Int(1), evaluate(Read(arr, Int(0)))); assertEquals(Int(2), evaluate(Read(arr, Int(1)))); @@ -380,9 +367,9 @@ public void testRead() { @Test public void testWrite() { - var elems = new ArrayList, ? extends Expr>>(); - elems.add(Tuple2.of(Int(0), Int(1))); - elems.add(Tuple2.of(Int(1), Int(2))); + var elems = new ArrayList, ? extends Expr>>(); + elems.add(new Pair<>(Int(0), Int(1))); + elems.add(new Pair<>(Int(1), Int(2))); var arr = Array(elems, Int(100), Array(Int(), Int())); var arr1 = Write(arr, Int(0), Int(34)); @@ -399,11 +386,11 @@ public void testWrite() { @Test public void testArrayInit() { - var elems = new ArrayList, Expr>>(); + var elems = new ArrayList, Expr>>(); VarDecl noname = Var("noname", Int()); - elems.add(Tuple2.of(Int(0), Int(1))); - elems.add(Tuple2.of(Int(1), Int(2))); - elems.add(Tuple2.of(Int(2), Add(noname.getRef(), Int(3)))); + elems.add(new Pair<>(Int(0), Int(1))); + elems.add(new Pair<>(Int(1), Int(2))); + elems.add(new Pair<>(Int(2), Add(noname.getRef(), Int(3)))); var arr = ArrayInit(elems, Int(100), Array(Int(), Int())); ImmutableValuation val = ImmutableValuation.builder().put(noname, Int(1)).build(); diff --git a/subprojects/common/core/src/test/java/hu/bme/mit/theta/core/utils/ExprCanonizerTest.java b/subprojects/common/core/src/test/java/hu/bme/mit/theta/core/utils/ExprCanonizerTest.java index bd55c851aa..e8a51a3274 100644 --- a/subprojects/common/core/src/test/java/hu/bme/mit/theta/core/utils/ExprCanonizerTest.java +++ b/subprojects/common/core/src/test/java/hu/bme/mit/theta/core/utils/ExprCanonizerTest.java @@ -15,17 +15,6 @@ */ package hu.bme.mit.theta.core.utils; -import static hu.bme.mit.theta.core.decl.Decls.Const; -import static hu.bme.mit.theta.core.type.anytype.Exprs.Ite; -import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.*; -import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.Read; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.*; -import static hu.bme.mit.theta.core.type.inttype.IntExprs.*; -import static hu.bme.mit.theta.core.type.rattype.RatExprs.*; -import static hu.bme.mit.theta.core.utils.ExprCanonizer.canonize; -import static org.junit.Assert.assertEquals; - -import hu.bme.mit.theta.common.Tuple2; import hu.bme.mit.theta.core.decl.ConstDecl; import hu.bme.mit.theta.core.type.Expr; import hu.bme.mit.theta.core.type.booltype.BoolType; @@ -33,14 +22,34 @@ import hu.bme.mit.theta.core.type.inttype.IntType; import hu.bme.mit.theta.core.type.rattype.RatExprs; import hu.bme.mit.theta.core.type.rattype.RatType; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; +import kotlin.Pair; import org.junit.Test; import org.junit.experimental.runners.Enclosed; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; + +import static hu.bme.mit.theta.core.decl.Decls.Const; +import static hu.bme.mit.theta.core.type.anytype.Exprs.Ite; +import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.*; +import static hu.bme.mit.theta.core.type.booltype.BoolExprs.*; +import static hu.bme.mit.theta.core.type.inttype.IntExprs.*; +import static hu.bme.mit.theta.core.type.inttype.IntExprs.Div; +import static hu.bme.mit.theta.core.type.inttype.IntExprs.Geq; +import static hu.bme.mit.theta.core.type.inttype.IntExprs.Gt; +import static hu.bme.mit.theta.core.type.inttype.IntExprs.Leq; +import static hu.bme.mit.theta.core.type.inttype.IntExprs.Lt; +import static hu.bme.mit.theta.core.type.inttype.IntExprs.Sub; +import static hu.bme.mit.theta.core.type.rattype.RatExprs.*; +import static hu.bme.mit.theta.core.type.rattype.RatExprs.Div; +import static hu.bme.mit.theta.core.type.rattype.RatExprs.Neg; +import static hu.bme.mit.theta.core.type.rattype.RatExprs.Sub; +import static hu.bme.mit.theta.core.utils.ExprCanonizer.canonize; +import static org.junit.Assert.assertEquals; + @RunWith(Enclosed.class) public class ExprCanonizerTest { @@ -475,9 +484,9 @@ public void testIte() { // Array @Test public void testArrayRead() { - var elems = new ArrayList, ? extends Expr>>(); - elems.add(Tuple2.of(Int(0), Int(1))); - elems.add(Tuple2.of(Int(1), Int(2))); + var elems = new ArrayList, ? extends Expr>>(); + elems.add(new Pair<>(Int(0), Int(1))); + elems.add(new Pair<>(Int(1), Int(2))); var arr = Array(elems, Int(100), Array(Int(), Int())); assertEquals(Read(arr, Int(0)), canonize(Read(arr, Int(0)))); assertEquals(Read(arr, a), canonize(Read(arr, a))); @@ -485,8 +494,8 @@ public void testArrayRead() { @Test public void testArrayWrite() { - var elems = new ArrayList, ? extends Expr>>(); - elems.add(Tuple2.of(Int(0), Int(1))); + var elems = new ArrayList, ? extends Expr>>(); + elems.add(new Pair<>(Int(0), Int(1))); var arr = Array(elems, Int(100), Array(Int(), Int())); assertEquals(Write(arr, Int(5), Int(6)), canonize(Write(arr, Int(5), Int(6)))); assertEquals(Write(arr, b, a), canonize(Write(arr, b, a))); diff --git a/subprojects/common/core/src/test/java/hu/bme/mit/theta/core/utils/ExprSimplifierTest.java b/subprojects/common/core/src/test/java/hu/bme/mit/theta/core/utils/ExprSimplifierTest.java index 45b9f1792f..3787f5f210 100644 --- a/subprojects/common/core/src/test/java/hu/bme/mit/theta/core/utils/ExprSimplifierTest.java +++ b/subprojects/common/core/src/test/java/hu/bme/mit/theta/core/utils/ExprSimplifierTest.java @@ -15,38 +15,46 @@ */ package hu.bme.mit.theta.core.utils; +import hu.bme.mit.theta.core.decl.ConstDecl; +import hu.bme.mit.theta.core.decl.VarDecl; +import hu.bme.mit.theta.core.model.ImmutableValuation; +import hu.bme.mit.theta.core.model.Valuation; +import hu.bme.mit.theta.core.type.Expr; +import hu.bme.mit.theta.core.type.LitExpr; +import hu.bme.mit.theta.core.type.arraytype.ArrayInitExpr; +import hu.bme.mit.theta.core.type.arraytype.ArrayLitExpr; +import hu.bme.mit.theta.core.type.arraytype.ArrayReadExpr; +import hu.bme.mit.theta.core.type.booltype.BoolType; +import hu.bme.mit.theta.core.type.bvtype.BvExprs; +import hu.bme.mit.theta.core.type.bvtype.BvType; +import hu.bme.mit.theta.core.type.inttype.IntType; +import hu.bme.mit.theta.core.type.rattype.RatType; +import kotlin.Pair; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.List; + import static hu.bme.mit.theta.core.decl.Decls.Const; import static hu.bme.mit.theta.core.decl.Decls.Var; import static hu.bme.mit.theta.core.type.anytype.Exprs.Ite; -import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.Array; -import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.ArrayInit; -import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.Read; -import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.Write; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.And; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.False; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Iff; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Imply; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Not; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Or; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.True; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Xor; +import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.*; +import static hu.bme.mit.theta.core.type.booltype.BoolExprs.*; import static hu.bme.mit.theta.core.type.bvtype.BvExprs.Bv; import static hu.bme.mit.theta.core.type.bvtype.BvExprs.BvType; +import static hu.bme.mit.theta.core.type.inttype.IntExprs.*; import static hu.bme.mit.theta.core.type.inttype.IntExprs.Add; import static hu.bme.mit.theta.core.type.inttype.IntExprs.Div; import static hu.bme.mit.theta.core.type.inttype.IntExprs.Eq; import static hu.bme.mit.theta.core.type.inttype.IntExprs.Geq; import static hu.bme.mit.theta.core.type.inttype.IntExprs.Gt; -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; import static hu.bme.mit.theta.core.type.inttype.IntExprs.Leq; import static hu.bme.mit.theta.core.type.inttype.IntExprs.Lt; -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Mod; import static hu.bme.mit.theta.core.type.inttype.IntExprs.Mul; import static hu.bme.mit.theta.core.type.inttype.IntExprs.Neg; import static hu.bme.mit.theta.core.type.inttype.IntExprs.Neq; import static hu.bme.mit.theta.core.type.inttype.IntExprs.Sub; -import static hu.bme.mit.theta.core.type.inttype.IntExprs.ToRat; +import static hu.bme.mit.theta.core.type.rattype.RatExprs.*; import static hu.bme.mit.theta.core.type.rattype.RatExprs.Add; import static hu.bme.mit.theta.core.type.rattype.RatExprs.Div; import static hu.bme.mit.theta.core.type.rattype.RatExprs.Eq; @@ -57,32 +65,9 @@ import static hu.bme.mit.theta.core.type.rattype.RatExprs.Mul; import static hu.bme.mit.theta.core.type.rattype.RatExprs.Neg; import static hu.bme.mit.theta.core.type.rattype.RatExprs.Neq; -import static hu.bme.mit.theta.core.type.rattype.RatExprs.Rat; import static hu.bme.mit.theta.core.type.rattype.RatExprs.Sub; -import static hu.bme.mit.theta.core.type.rattype.RatExprs.ToInt; import static hu.bme.mit.theta.core.utils.ExprUtils.simplify; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - -import hu.bme.mit.theta.common.Tuple2; -import hu.bme.mit.theta.core.decl.ConstDecl; -import hu.bme.mit.theta.core.decl.VarDecl; -import hu.bme.mit.theta.core.model.ImmutableValuation; -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.type.arraytype.ArrayInitExpr; -import hu.bme.mit.theta.core.type.arraytype.ArrayLitExpr; -import hu.bme.mit.theta.core.type.arraytype.ArrayReadExpr; -import hu.bme.mit.theta.core.type.booltype.BoolType; -import hu.bme.mit.theta.core.type.bvtype.BvExprs; -import hu.bme.mit.theta.core.type.bvtype.BvType; -import hu.bme.mit.theta.core.type.inttype.IntType; -import hu.bme.mit.theta.core.type.rattype.RatType; -import java.util.ArrayList; -import java.util.List; -import org.junit.Test; +import static org.junit.Assert.*; public class ExprSimplifierTest { @@ -679,9 +664,9 @@ public void testIte() { // Array @Test public void testArrayRead() { - var elems = new ArrayList, ? extends Expr>>(); - elems.add(Tuple2.of(Int(0), Int(1))); - elems.add(Tuple2.of(Int(1), Int(2))); + var elems = new ArrayList, ? extends Expr>>(); + elems.add(new Pair<>(Int(0), Int(1))); + elems.add(new Pair<>(Int(1), Int(2))); var arr = Array(elems, Int(100), Array(Int(), Int())); assertEquals(Int(1), simplify(Read(arr, Int(0)))); assertEquals(Int(2), simplify(Read(arr, Int(1)))); @@ -690,8 +675,8 @@ public void testArrayRead() { @Test public void testArrayWrite() { - var elems = new ArrayList, ? extends Expr>>(); - elems.add(Tuple2.of(Int(0), Int(1))); + var elems = new ArrayList, ? extends Expr>>(); + elems.add(new Pair<>(Int(0), Int(1))); var arr = Array(elems, Int(100), Array(Int(), Int())); var newArr = simplify(Write(arr, Int(5), Int(6))); assertTrue(newArr instanceof ArrayLitExpr); @@ -702,15 +687,15 @@ public void testArrayWrite() { @Test public void testArrayInit() { - var elems = new ArrayList, Expr>>(); - elems.add(Tuple2.of(Int(0), Int(1))); - elems.add(Tuple2.of(Int(1), Add(Int(1), Int(2)))); + var elems = new ArrayList, Expr>>(); + elems.add(new Pair<>(Int(0), Int(1))); + elems.add(new Pair<>(Int(1), Add(Int(1), Int(2)))); var initArr = ArrayInit(elems, Int(100), Array(Int(), Int())); var litArr = simplify(initArr); assertTrue(litArr instanceof ArrayLitExpr); VarDecl noname = Var("noname", Int()); - elems.add(Tuple2.of(Int(2), Add(noname.getRef(), Int(1)))); + elems.add(new Pair<>(Int(2), Add(noname.getRef(), Int(1)))); var arr = ArrayInit(elems, Int(100), Array(Int(), Int())); var newArr = simplify(arr); assertTrue(newArr instanceof ArrayInitExpr); From d9cd1d671e32f0002e5b016c17fc7e1f01cadf4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Csan=C3=A1d=20Telbisz?= Date: Thu, 26 Jun 2025 12:00:27 +0200 Subject: [PATCH 28/48] wip --- settings.gradle.kts | 1 + subprojects/common/core/build.gradle.kts | 15 ++ .../mit/theta/core/type/functype/FuncType.kt | 46 ----- .../hu/bme/mit/theta/core/ChcUtils.kt | 0 .../bme/mit/theta/core/decl/BasicConstDecl.kt | 0 .../hu/bme/mit/theta/core/decl/ConstDecl.kt | 0 .../hu/bme/mit/theta/core/decl/Decl.kt | 0 .../hu/bme/mit/theta/core/decl/Decls.kt | 0 .../mit/theta/core/decl/IndexedConstDecl.kt | 0 .../hu/bme/mit/theta/core/decl/ParamDecl.kt | 0 .../hu/bme/mit/theta/core/decl/VarDecl.kt | 0 .../bme/mit/theta/core/decl/package-info.java | 0 .../serialization/BigIntegerSerializer.kt} | 0 .../core/serialization/GenericSerializer.kt | 59 +++++++ .../serialization/StmtSerializerModule.kt | 37 ++++ .../bme/mit/theta/core/serialization/Test.kt | 128 ++++++++++++++ .../serialization/TypeSerializerModule.kt | 48 ++++++ .../hu/bme/mit/theta/core/stmt/AssignStmt.kt | 0 .../hu/bme/mit/theta/core/stmt/AssumeStmt.kt | 0 .../hu/bme/mit/theta/core/stmt/HavocStmt.kt | 0 .../hu/bme/mit/theta/core/stmt/IfStmt.kt | 0 .../hu/bme/mit/theta/core/stmt/LoopStmt.kt | 0 .../mit/theta/core/stmt/MemoryAssignStmt.kt | 0 .../hu/bme/mit/theta/core/stmt/NonDetStmt.kt | 0 .../hu/bme/mit/theta/core/stmt/OrtStmt.kt | 0 .../bme/mit/theta/core/stmt/SequenceStmt.kt | 0 .../hu/bme/mit/theta/core/stmt/SkipStmt.kt | 0 .../hu/bme/mit/theta/core/stmt/Stmt.kt | 0 .../hu/bme/mit/theta/core/stmt/StmtVisitor.kt | 0 .../hu/bme/mit/theta/core/stmt/Stmts.kt | 0 .../hu/bme/mit/theta/core/type/BinaryExpr.kt | 0 .../bme/mit/theta/core/type/DomainSize.java | 98 +++++++++++ .../hu/bme/mit/theta/core/type/Expr.kt | 0 .../hu/bme/mit/theta/core/type/LitExpr.kt | 0 .../bme/mit/theta/core/type/MultiaryExpr.kt | 0 .../hu/bme/mit/theta/core/type/NullaryExpr.kt | 0 .../hu/bme/mit/theta/core/type/Type.kt | 0 .../hu/bme/mit/theta/core/type/UnaryExpr.kt | 0 .../core/type/abstracttype/AbstractExprs.kt | 0 .../theta/core/type/abstracttype/AddExpr.kt | 0 .../theta/core/type/abstracttype/Additive.kt | 0 .../theta/core/type/abstracttype/CastExpr.kt | 0 .../theta/core/type/abstracttype/Castable.kt | 0 .../theta/core/type/abstracttype/DivExpr.kt | 0 .../theta/core/type/abstracttype/Divisible.kt | 0 .../theta/core/type/abstracttype/EqExpr.kt | 0 .../core/type/abstracttype/Equational.kt | 0 .../theta/core/type/abstracttype/GeqExpr.kt | 0 .../theta/core/type/abstracttype/GtExpr.kt | 0 .../theta/core/type/abstracttype/LeqExpr.kt | 0 .../theta/core/type/abstracttype/LtExpr.kt | 0 .../theta/core/type/abstracttype/ModExpr.kt | 0 .../theta/core/type/abstracttype/MulExpr.kt | 0 .../core/type/abstracttype/Multiplicative.kt | 0 .../theta/core/type/abstracttype/NegExpr.kt | 0 .../theta/core/type/abstracttype/NeqExpr.kt | 0 .../theta/core/type/abstracttype/Ordered.kt | 0 .../theta/core/type/abstracttype/PosExpr.kt | 0 .../theta/core/type/abstracttype/RemExpr.kt | 0 .../theta/core/type/abstracttype/SubExpr.kt | 0 .../core/type/abstracttype/package-info.java | 0 .../theta/core/type/anytype/Dereference.kt | 0 .../bme/mit/theta/core/type/anytype/Exprs.kt | 0 .../theta/core/type/anytype/InvalidLitExpr.kt | 0 .../mit/theta/core/type/anytype/IteExpr.kt | 0 .../mit/theta/core/type/anytype/PrimeExpr.kt | 0 .../mit/theta/core/type/anytype/RefExpr.kt | 0 .../mit/theta/core/type/anytype/Reference.kt | 0 .../theta/core/type/anytype/package-info.java | 0 .../theta/core/type/arraytype/ArrayEqExpr.kt | 0 .../theta/core/type/arraytype/ArrayExprs.kt | 0 .../core/type/arraytype/ArrayInitExpr.kt | 0 .../theta/core/type/arraytype/ArrayLitExpr.kt | 49 +++++- .../theta/core/type/arraytype/ArrayNeqExpr.kt | 0 .../core/type/arraytype/ArrayReadExpr.kt | 0 .../theta/core/type/arraytype/ArrayType.kt | 40 ++++- .../core/type/arraytype/ArrayWriteExpr.kt | 0 .../core/type/arraytype/package-info.java | 0 .../mit/theta/core/type/booltype/AndExpr.kt | 0 .../mit/theta/core/type/booltype/BoolExprs.kt | 0 .../theta/core/type/booltype/BoolLitExpr.kt | 0 .../mit/theta/core/type/booltype/BoolType.kt | 2 +- .../mit/theta/core/type/booltype/IffExpr.kt | 0 .../mit/theta/core/type/booltype/ImplyExpr.kt | 0 .../mit/theta/core/type/booltype/NotExpr.kt | 0 .../mit/theta/core/type/booltype/OrExpr.kt | 0 .../core/type/booltype/QuantifiedExpr.kt | 0 .../core/type/booltype/SmartBoolExprs.kt | 0 .../mit/theta/core/type/booltype/XorExpr.kt | 0 .../core/type/booltype/package-info.java | 0 .../mit/theta/core/type/bvtype/BvAddExpr.kt | 0 .../mit/theta/core/type/bvtype/BvAndExpr.kt | 0 .../core/type/bvtype/BvArithShiftRightExpr.kt | 0 .../theta/core/type/bvtype/BvConcatExpr.kt | 0 .../mit/theta/core/type/bvtype/BvEqExpr.kt | 0 .../bme/mit/theta/core/type/bvtype/BvExprs.kt | 0 .../theta/core/type/bvtype/BvExtractExpr.kt | 0 .../mit/theta/core/type/bvtype/BvLitExpr.kt | 0 .../core/type/bvtype/BvLogicShiftRightExpr.kt | 0 .../mit/theta/core/type/bvtype/BvMulExpr.kt | 0 .../mit/theta/core/type/bvtype/BvNegExpr.kt | 0 .../mit/theta/core/type/bvtype/BvNeqExpr.kt | 0 .../mit/theta/core/type/bvtype/BvNotExpr.kt | 0 .../mit/theta/core/type/bvtype/BvOrExpr.kt | 0 .../mit/theta/core/type/bvtype/BvPosExpr.kt | 0 .../core/type/bvtype/BvRotateLeftExpr.kt | 0 .../core/type/bvtype/BvRotateRightExpr.kt | 0 .../mit/theta/core/type/bvtype/BvSDivExpr.kt | 0 .../mit/theta/core/type/bvtype/BvSExtExpr.kt | 0 .../mit/theta/core/type/bvtype/BvSGeqExpr.kt | 0 .../mit/theta/core/type/bvtype/BvSGtExpr.kt | 0 .../mit/theta/core/type/bvtype/BvSLeqExpr.kt | 0 .../mit/theta/core/type/bvtype/BvSLtExpr.kt | 0 .../mit/theta/core/type/bvtype/BvSModExpr.kt | 0 .../mit/theta/core/type/bvtype/BvSRemExpr.kt | 0 .../theta/core/type/bvtype/BvShiftLeftExpr.kt | 0 .../core/type/bvtype/BvSignChangeExpr.kt | 0 .../mit/theta/core/type/bvtype/BvSubExpr.kt | 0 .../bme/mit/theta/core/type/bvtype/BvType.kt | 0 .../mit/theta/core/type/bvtype/BvUDivExpr.kt | 0 .../mit/theta/core/type/bvtype/BvUGeqExpr.kt | 0 .../mit/theta/core/type/bvtype/BvUGtExpr.kt | 0 .../mit/theta/core/type/bvtype/BvULeqExpr.kt | 0 .../mit/theta/core/type/bvtype/BvULtExpr.kt | 0 .../mit/theta/core/type/bvtype/BvURemExpr.kt | 0 .../mit/theta/core/type/bvtype/BvXorExpr.kt | 0 .../mit/theta/core/type/bvtype/BvZExtExpr.kt | 0 .../theta/core/type/bvtype/package-info.java | 0 .../theta/core/type/enumtype/EnumEqExpr.kt | 0 .../theta/core/type/enumtype/EnumLitExpr.kt | 0 .../theta/core/type/enumtype/EnumNeqExpr.kt | 0 .../mit/theta/core/type/enumtype/EnumType.kt | 0 .../mit/theta/core/type/fptype/FpAbsExpr.kt | 0 .../mit/theta/core/type/fptype/FpAddExpr.kt | 0 .../theta/core/type/fptype/FpAssignExpr.kt | 0 .../mit/theta/core/type/fptype/FpDivExpr.kt | 0 .../mit/theta/core/type/fptype/FpEqExpr.kt | 0 .../bme/mit/theta/core/type/fptype/FpExprs.kt | 0 .../theta/core/type/fptype/FpFromBvExpr.kt | 0 .../mit/theta/core/type/fptype/FpGeqExpr.kt | 0 .../mit/theta/core/type/fptype/FpGtExpr.kt | 0 .../core/type/fptype/FpIsInfiniteExpr.kt | 0 .../mit/theta/core/type/fptype/FpIsNanExpr.kt | 0 .../mit/theta/core/type/fptype/FpLeqExpr.kt | 0 .../mit/theta/core/type/fptype/FpLitExpr.kt | 0 .../mit/theta/core/type/fptype/FpLtExpr.kt | 0 .../mit/theta/core/type/fptype/FpMaxExpr.kt | 0 .../mit/theta/core/type/fptype/FpMinExpr.kt | 0 .../mit/theta/core/type/fptype/FpMulExpr.kt | 0 .../mit/theta/core/type/fptype/FpNegExpr.kt | 0 .../mit/theta/core/type/fptype/FpNeqExpr.kt | 0 .../mit/theta/core/type/fptype/FpPosExpr.kt | 0 .../mit/theta/core/type/fptype/FpRemExpr.kt | 0 .../core/type/fptype/FpRoundToIntegralExpr.kt | 0 .../theta/core/type/fptype/FpRoundingMode.kt | 0 .../mit/theta/core/type/fptype/FpSqrtExpr.kt | 0 .../mit/theta/core/type/fptype/FpSubExpr.kt | 0 .../mit/theta/core/type/fptype/FpToBvExpr.kt | 0 .../mit/theta/core/type/fptype/FpToFpExpr.kt | 0 .../bme/mit/theta/core/type/fptype/FpType.kt | 0 .../theta/core/type/functype/FuncAppExpr.kt | 0 .../theta/core/type/functype/FuncLitExpr.kt | 0 .../mit/theta/core/type/functype/FuncType.kt | 84 +++++++++ .../mit/theta/core/type/inttype/IntAddExpr.kt | 0 .../mit/theta/core/type/inttype/IntDivExpr.kt | 0 .../mit/theta/core/type/inttype/IntEqExpr.kt | 0 .../mit/theta/core/type/inttype/IntExprs.kt | 0 .../mit/theta/core/type/inttype/IntGeqExpr.kt | 0 .../mit/theta/core/type/inttype/IntGtExpr.kt | 0 .../mit/theta/core/type/inttype/IntLeqExpr.kt | 0 .../mit/theta/core/type/inttype/IntLitExpr.kt | 0 .../mit/theta/core/type/inttype/IntLtExpr.kt | 0 .../mit/theta/core/type/inttype/IntModExpr.kt | 0 .../mit/theta/core/type/inttype/IntMulExpr.kt | 0 .../mit/theta/core/type/inttype/IntNegExpr.kt | 0 .../mit/theta/core/type/inttype/IntNeqExpr.kt | 0 .../mit/theta/core/type/inttype/IntPosExpr.kt | 0 .../mit/theta/core/type/inttype/IntRemExpr.kt | 0 .../mit/theta/core/type/inttype/IntSubExpr.kt | 0 .../theta/core/type/inttype/IntToRatExpr.kt | 0 .../mit/theta/core/type/inttype/IntType.kt | 0 .../theta/core/type/inttype/package-info.java | 0 .../bme/mit/theta/core/type/package-info.java | 34 ++++ .../mit/theta/core/type/rattype/RatAddExpr.kt | 0 .../mit/theta/core/type/rattype/RatDivExpr.kt | 0 .../mit/theta/core/type/rattype/RatEqExpr.kt | 0 .../mit/theta/core/type/rattype/RatExprs.kt | 0 .../mit/theta/core/type/rattype/RatGeqExpr.kt | 0 .../mit/theta/core/type/rattype/RatGtExpr.kt | 0 .../mit/theta/core/type/rattype/RatLeqExpr.kt | 0 .../mit/theta/core/type/rattype/RatLitExpr.kt | 0 .../mit/theta/core/type/rattype/RatLtExpr.kt | 0 .../mit/theta/core/type/rattype/RatMulExpr.kt | 0 .../mit/theta/core/type/rattype/RatNegExpr.kt | 0 .../mit/theta/core/type/rattype/RatNeqExpr.kt | 0 .../mit/theta/core/type/rattype/RatPosExpr.kt | 0 .../mit/theta/core/type/rattype/RatSubExpr.kt | 0 .../theta/core/type/rattype/RatToIntExpr.kt | 0 .../mit/theta/core/type/rattype/RatType.kt | 0 .../theta/core/type/rattype/package-info.java | 0 .../serialization/StmtSerializationTest.kt | 141 +++++++++++++++ .../serialization/TypeSerializationTest.kt | 161 ++++++++++++++++++ subprojects/common/ksp-processor/README.md | 1 + .../build.gradle.kts} | 13 +- .../theta/ksp/PolymorphicModuleProcessor.kt | 146 ++++++++++++++++ .../ksp/PolymorphicModuleProcessorProvider.kt | 20 +++ ...ols.ksp.processing.SymbolProcessorProvider | 3 + 207 files changed, 1069 insertions(+), 57 deletions(-) delete mode 100644 subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/functype/FuncType.kt rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/ChcUtils.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/decl/BasicConstDecl.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/decl/ConstDecl.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/decl/Decl.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/decl/Decls.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/decl/IndexedConstDecl.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/decl/ParamDecl.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/decl/VarDecl.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/decl/package-info.java (100%) rename subprojects/common/core/src/main/{java/hu/bme/mit/theta/core/serialization/Serializers.kt => kotlin/hu/bme/mit/theta/core/serialization/BigIntegerSerializer.kt} (100%) create mode 100644 subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/serialization/GenericSerializer.kt create mode 100644 subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/serialization/StmtSerializerModule.kt create mode 100644 subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/serialization/Test.kt create mode 100644 subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/serialization/TypeSerializerModule.kt rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/stmt/AssignStmt.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/stmt/AssumeStmt.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/stmt/HavocStmt.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/stmt/IfStmt.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/stmt/LoopStmt.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/stmt/MemoryAssignStmt.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/stmt/NonDetStmt.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/stmt/OrtStmt.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/stmt/SequenceStmt.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/stmt/SkipStmt.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/stmt/Stmt.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/stmt/StmtVisitor.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/stmt/Stmts.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/BinaryExpr.kt (100%) create mode 100644 subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/DomainSize.java rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/Expr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/LitExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/MultiaryExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/NullaryExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/Type.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/UnaryExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/abstracttype/AbstractExprs.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/abstracttype/AddExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/abstracttype/Additive.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/abstracttype/CastExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/abstracttype/Castable.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/abstracttype/DivExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/abstracttype/Divisible.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/abstracttype/EqExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/abstracttype/Equational.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/abstracttype/GeqExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/abstracttype/GtExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/abstracttype/LeqExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/abstracttype/LtExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/abstracttype/ModExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/abstracttype/MulExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/abstracttype/Multiplicative.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/abstracttype/NegExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/abstracttype/NeqExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/abstracttype/Ordered.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/abstracttype/PosExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/abstracttype/RemExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/abstracttype/SubExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/abstracttype/package-info.java (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/anytype/Dereference.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/anytype/Exprs.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/anytype/InvalidLitExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/anytype/IteExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/anytype/PrimeExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/anytype/RefExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/anytype/Reference.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/anytype/package-info.java (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/arraytype/ArrayEqExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/arraytype/ArrayExprs.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/arraytype/ArrayInitExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/arraytype/ArrayLitExpr.kt (54%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/arraytype/ArrayNeqExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/arraytype/ArrayReadExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/arraytype/ArrayType.kt (57%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/arraytype/ArrayWriteExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/arraytype/package-info.java (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/booltype/AndExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/booltype/BoolExprs.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/booltype/BoolLitExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/booltype/BoolType.kt (96%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/booltype/IffExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/booltype/ImplyExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/booltype/NotExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/booltype/OrExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/booltype/QuantifiedExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/booltype/SmartBoolExprs.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/booltype/XorExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/booltype/package-info.java (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/bvtype/BvAddExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/bvtype/BvAndExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/bvtype/BvArithShiftRightExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/bvtype/BvConcatExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/bvtype/BvEqExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/bvtype/BvExprs.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/bvtype/BvExtractExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/bvtype/BvLitExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/bvtype/BvLogicShiftRightExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/bvtype/BvMulExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/bvtype/BvNegExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/bvtype/BvNeqExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/bvtype/BvNotExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/bvtype/BvOrExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/bvtype/BvPosExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/bvtype/BvRotateLeftExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/bvtype/BvRotateRightExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/bvtype/BvSDivExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/bvtype/BvSExtExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/bvtype/BvSGeqExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/bvtype/BvSGtExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/bvtype/BvSLeqExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/bvtype/BvSLtExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/bvtype/BvSModExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/bvtype/BvSRemExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/bvtype/BvShiftLeftExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/bvtype/BvSignChangeExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/bvtype/BvSubExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/bvtype/BvType.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/bvtype/BvUDivExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/bvtype/BvUGeqExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/bvtype/BvUGtExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/bvtype/BvULeqExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/bvtype/BvULtExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/bvtype/BvURemExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/bvtype/BvXorExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/bvtype/BvZExtExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/bvtype/package-info.java (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/enumtype/EnumEqExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/enumtype/EnumLitExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/enumtype/EnumNeqExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/enumtype/EnumType.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/fptype/FpAbsExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/fptype/FpAddExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/fptype/FpAssignExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/fptype/FpDivExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/fptype/FpEqExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/fptype/FpExprs.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/fptype/FpFromBvExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/fptype/FpGeqExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/fptype/FpGtExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/fptype/FpIsInfiniteExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/fptype/FpIsNanExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/fptype/FpLeqExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/fptype/FpLitExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/fptype/FpLtExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/fptype/FpMaxExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/fptype/FpMinExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/fptype/FpMulExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/fptype/FpNegExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/fptype/FpNeqExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/fptype/FpPosExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/fptype/FpRemExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/fptype/FpRoundToIntegralExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/fptype/FpRoundingMode.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/fptype/FpSqrtExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/fptype/FpSubExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/fptype/FpToBvExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/fptype/FpToFpExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/fptype/FpType.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/functype/FuncAppExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/functype/FuncLitExpr.kt (100%) create mode 100644 subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/functype/FuncType.kt rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/inttype/IntAddExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/inttype/IntDivExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/inttype/IntEqExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/inttype/IntExprs.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/inttype/IntGeqExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/inttype/IntGtExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/inttype/IntLeqExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/inttype/IntLitExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/inttype/IntLtExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/inttype/IntModExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/inttype/IntMulExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/inttype/IntNegExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/inttype/IntNeqExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/inttype/IntPosExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/inttype/IntRemExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/inttype/IntSubExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/inttype/IntToRatExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/inttype/IntType.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/inttype/package-info.java (100%) create mode 100644 subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/package-info.java rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/rattype/RatAddExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/rattype/RatDivExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/rattype/RatEqExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/rattype/RatExprs.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/rattype/RatGeqExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/rattype/RatGtExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/rattype/RatLeqExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/rattype/RatLitExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/rattype/RatLtExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/rattype/RatMulExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/rattype/RatNegExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/rattype/RatNeqExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/rattype/RatPosExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/rattype/RatSubExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/rattype/RatToIntExpr.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/rattype/RatType.kt (100%) rename subprojects/common/core/src/main/{java => kotlin}/hu/bme/mit/theta/core/type/rattype/package-info.java (100%) create mode 100644 subprojects/common/core/src/test/kotlin/hu/bme/mit/theta/core/serialization/StmtSerializationTest.kt create mode 100644 subprojects/common/core/src/test/kotlin/hu/bme/mit/theta/core/serialization/TypeSerializationTest.kt create mode 100644 subprojects/common/ksp-processor/README.md rename subprojects/common/{core/src/main/java/hu/bme/mit/theta/core/stmt/package-info.java => ksp-processor/build.gradle.kts} (71%) create mode 100644 subprojects/common/ksp-processor/src/main/kotlin/hu/bme/mit/theta/ksp/PolymorphicModuleProcessor.kt create mode 100644 subprojects/common/ksp-processor/src/main/kotlin/hu/bme/mit/theta/ksp/PolymorphicModuleProcessorProvider.kt create mode 100644 subprojects/common/ksp-processor/src/main/resources/META-INF/services/com.google.devtools.ksp.processing.SymbolProcessorProvider diff --git a/settings.gradle.kts b/settings.gradle.kts index 6f8adcc960..fd9a83a92b 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -20,6 +20,7 @@ include( "common/common", "common/core", "common/grammar", + "common/ksp-processor", "common/multi-tests", "common/ltl", "common/ltl-cli", diff --git a/subprojects/common/core/build.gradle.kts b/subprojects/common/core/build.gradle.kts index e00eafe5d3..c4414e105c 100644 --- a/subprojects/common/core/build.gradle.kts +++ b/subprojects/common/core/build.gradle.kts @@ -20,12 +20,27 @@ plugins { id("kotlin-common") id("kaml-serialization") id("kotlinx-serialization") + id("com.google.devtools.ksp") version "1.9.25-1.0.20" } dependencies { implementation(project(":theta-common")) + implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.3") testFixturesImplementation(project(":theta-common")) val libPath: String by rootProject.extra testFixturesImplementation(fileTree(mapOf("dir" to libPath, "include" to listOf("*.jar")))) testFixturesImplementation(Deps.guava) + ksp(project(":theta-ksp-processor")) +} + +kotlin { + sourceSets["main"].kotlin.srcDir("build/generated/ksp/main/kotlin") +} + +tasks.withType { + when (name) { + "kspKotlin" -> dependsOn("generateGrammarSource") + "kspTestKotlin" -> dependsOn("generateTestGrammarSource") + "kspTestFixturesKotlin" -> dependsOn("generateTestFixturesGrammarSource") + } } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/functype/FuncType.kt b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/functype/FuncType.kt deleted file mode 100644 index c213403712..0000000000 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/functype/FuncType.kt +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.core.type.functype - -import hu.bme.mit.theta.common.Utils -import hu.bme.mit.theta.core.type.DomainSize -import hu.bme.mit.theta.core.type.Type -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable - -/** Represents a function type from ParamType to ResultType. */ -@Serializable -@SerialName(FuncType.TYPE_LABEL) -data class FuncType( - val paramType: ParamType, - val resultType: ResultType, -) : Type { - - companion object { - - internal const val TYPE_LABEL = "Func" - - @JvmStatic - fun of(paramType: ParamType, resultType: ResultType) = - FuncType(paramType, resultType) - } - - override fun toString(): String = - Utils.lispStringBuilder(TYPE_LABEL).add(paramType).add(resultType).toString() - - override val domainSize: DomainSize - get() = throw UnsupportedOperationException() -} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/ChcUtils.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/ChcUtils.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/ChcUtils.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/ChcUtils.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/BasicConstDecl.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/BasicConstDecl.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/BasicConstDecl.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/BasicConstDecl.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/ConstDecl.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/ConstDecl.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/ConstDecl.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/ConstDecl.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/Decl.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/Decl.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/Decl.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/Decl.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/Decls.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/Decls.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/Decls.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/Decls.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/IndexedConstDecl.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/IndexedConstDecl.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/IndexedConstDecl.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/IndexedConstDecl.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/ParamDecl.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/ParamDecl.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/ParamDecl.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/ParamDecl.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/VarDecl.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/VarDecl.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/VarDecl.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/VarDecl.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/package-info.java b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/package-info.java similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/decl/package-info.java rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/package-info.java diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/serialization/Serializers.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/serialization/BigIntegerSerializer.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/serialization/Serializers.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/serialization/BigIntegerSerializer.kt diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/serialization/GenericSerializer.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/serialization/GenericSerializer.kt new file mode 100644 index 0000000000..bbfaafe47e --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/serialization/GenericSerializer.kt @@ -0,0 +1,59 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package hu.bme.mit.theta.core.serialization + +import hu.bme.mit.theta.core.type.Type +import hu.bme.mit.theta.core.type.arraytype.ArrayType +import kotlinx.serialization.KSerializer +import kotlinx.serialization.PolymorphicSerializer +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.descriptors.buildClassSerialDescriptor +import kotlinx.serialization.descriptors.element +import kotlinx.serialization.encoding.* + +class ArrayTypeSerializer : KSerializer> { + + override val descriptor: SerialDescriptor = buildClassSerialDescriptor("ArrayType") { + element("indexType") + element("elemType") + } + + override fun serialize(encoder: Encoder, value: ArrayType) = + encoder.encodeStructure(descriptor) { + encodeSerializableElement(descriptor, 0, PolymorphicSerializer(Type::class), value.indexType) + encodeSerializableElement(descriptor, 1, PolymorphicSerializer(Type::class), value.elemType) + } + + override fun deserialize(decoder: Decoder): ArrayType = decoder.decodeStructure(descriptor) { + var indexType: Type? = null + var elemType: Type? = null + + while (true) { + when (val index = decodeElementIndex(descriptor)) { + 0 -> indexType = decodeSerializableElement(descriptor, 0, PolymorphicSerializer(Type::class)) + 1 -> elemType = decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Type::class)) + CompositeDecoder.DECODE_DONE -> break + else -> error("Unexpected index: $index") + } + } + + ArrayType( + indexType = indexType ?: error("Missing indexType"), + elemType = elemType ?: error("Missing elemType") + ) + } +} \ No newline at end of file diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/serialization/StmtSerializerModule.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/serialization/StmtSerializerModule.kt new file mode 100644 index 0000000000..a49bdf1313 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/serialization/StmtSerializerModule.kt @@ -0,0 +1,37 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package hu.bme.mit.theta.core.serialization + +import hu.bme.mit.theta.core.stmt.* +import kotlinx.serialization.modules.SerializersModule +import kotlinx.serialization.modules.polymorphic +import kotlinx.serialization.modules.subclass + +val stmtSerializerModule = SerializersModule { + polymorphic(Stmt::class) { + subclass(AssignStmt::class) + subclass(AssumeStmt::class) + subclass(HavocStmt::class) + subclass(IfStmt::class) + subclass(LoopStmt::class) + subclass(MemoryAssignStmt::class) + subclass(NonDetStmt::class) + subclass(OrtStmt::class) + subclass(SequenceStmt::class) + subclass(SkipStmt::class) + } +} \ No newline at end of file diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/serialization/Test.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/serialization/Test.kt new file mode 100644 index 0000000000..0e16db3062 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/serialization/Test.kt @@ -0,0 +1,128 @@ +import kotlinx.serialization.* +import kotlinx.serialization.descriptors.* +import kotlinx.serialization.encoding.* +import kotlinx.serialization.json.Json +import kotlinx.serialization.modules.SerializersModule +import kotlinx.serialization.modules.polymorphic +import kotlinx.serialization.modules.subclass + +@Polymorphic +interface Type + +@Serializable +@SerialName("Bool") +data object BoolType : Type + +@Serializable +@SerialName("Int") +data class IntType(val a: Int) : Type + +@Serializable +@SerialName("String") +data class StringType(val b: Int) : Type + +// Generic ArrayType with custom serializer to avoid circular dependency +@Serializable(with = ArrayTypeSerializer::class) +@SerialName("Array") +data class ArrayType( + val indexType: IndexType, + val elemType: ElemType, +) : Type + +object ArrayTypeSerializer : KSerializer> { + override val descriptor: SerialDescriptor = buildClassSerialDescriptor("Array") { + element("indexType") + element("elemType") + } + + override fun serialize(encoder: Encoder, value: ArrayType) { + encoder.encodeStructure(descriptor) { + // Serialize the actual type objects polymorphically + encodeSerializableElement(descriptor, 0, PolymorphicSerializer(Type::class), value.indexType) + encodeSerializableElement(descriptor, 1, PolymorphicSerializer(Type::class), value.elemType) + } + } + + override fun deserialize(decoder: Decoder): ArrayType { + return decoder.decodeStructure(descriptor) { + var indexType: Type? = null + var elemType: Type? = null + + while (true) { + when (val index = decodeElementIndex(descriptor)) { + 0 -> indexType = decodeSerializableElement(descriptor, 0, PolymorphicSerializer(Type::class)) + 1 -> elemType = decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Type::class)) + CompositeDecoder.DECODE_DONE -> break + else -> error("Unexpected index: $index") + } + } + + ArrayType( + indexType = indexType ?: error("Missing indexType"), + elemType = elemType ?: error("Missing elemType") + ) + } + } +} + +// Configure the serialization module +val typeModule = SerializersModule { + polymorphic(Type::class) { + subclass(BoolType::class) + subclass(IntType::class) + subclass(StringType::class) + subclass(ArrayType::class, ArrayTypeSerializer) + } +} + +val json = Json { + serializersModule = typeModule + classDiscriminator = "type" +} + +// Usage example +fun main() { + val bool: Type = BoolType + val s1 = json.encodeToString(bool) + println("Serialized: $s1") + val d1 = json.decodeFromString(s1) + println("Deserialized: $d1") + + val int: Type = IntType(42) + val s2 = json.encodeToString(int) + println("Serialized: $s2") + val d2 = json.decodeFromString(s2) + println("Deserialized: $d2") + println((d2 as IntType).a) + + // Create a generic array type + val intStringArray = ArrayType( + indexType = IntType(1), + elemType = StringType(2) + ) + + // Serialize using the wrapper approach + val serialized = json.encodeToString(intStringArray) + println("Serialized: $serialized") + + val deserialized = json.decodeFromString(serialized) as ArrayType + println("Deserialized: $deserialized") + println(deserialized.indexType.a) + + + val nestedArray = ArrayType( + indexType = IntType(1), + elemType = ArrayType( + indexType = StringType(2), + elemType = IntType(3) + ) + ) + + // Serialize using the wrapper approach + val serialized2 = json.encodeToString(nestedArray) + println("Serialized: $serialized2") + + val deserialized2 = json.decodeFromString(serialized2) as ArrayType> + println("Deserialized: $deserialized2") + println(deserialized2.elemType.indexType.b) +} \ No newline at end of file diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/serialization/TypeSerializerModule.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/serialization/TypeSerializerModule.kt new file mode 100644 index 0000000000..3a070dfba3 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/serialization/TypeSerializerModule.kt @@ -0,0 +1,48 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package hu.bme.mit.theta.core.serialization + +import hu.bme.mit.theta.core.type.Type +import hu.bme.mit.theta.core.type.arraytype.ArrayType +import hu.bme.mit.theta.core.type.booltype.BoolType +import hu.bme.mit.theta.core.type.bvtype.BvType +import hu.bme.mit.theta.core.type.enumtype.EnumType +import hu.bme.mit.theta.core.type.fptype.FpType +import hu.bme.mit.theta.core.type.functype.FuncType +import hu.bme.mit.theta.core.type.inttype.IntType +import hu.bme.mit.theta.core.type.rattype.RatType +import kotlinx.serialization.PolymorphicSerializer +import kotlinx.serialization.modules.SerializersModule +import kotlinx.serialization.modules.polymorphic +import kotlinx.serialization.modules.subclass +import kotlinx.serialization.serializer + +val typeSerializerModule = SerializersModule { + polymorphic(Type::class) { + subclass(BoolType::class) + subclass(IntType::class) + subclass(BvType::class) + subclass(ArrayType::class, ArrayType.Serializer) + subclass(FuncType::class, FuncType.Serializer) + subclass(FpType::class) + subclass(RatType::class) + subclass(EnumType::class) + } +} + +val b = Type::class +val a = typeSerializerModule.serializer() diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/AssignStmt.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/AssignStmt.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/AssignStmt.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/AssignStmt.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/AssumeStmt.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/AssumeStmt.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/AssumeStmt.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/AssumeStmt.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/HavocStmt.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/HavocStmt.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/HavocStmt.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/HavocStmt.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/IfStmt.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/IfStmt.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/IfStmt.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/IfStmt.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/LoopStmt.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/LoopStmt.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/LoopStmt.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/LoopStmt.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/MemoryAssignStmt.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/MemoryAssignStmt.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/MemoryAssignStmt.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/MemoryAssignStmt.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/NonDetStmt.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/NonDetStmt.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/NonDetStmt.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/NonDetStmt.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/OrtStmt.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/OrtStmt.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/OrtStmt.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/OrtStmt.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/SequenceStmt.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/SequenceStmt.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/SequenceStmt.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/SequenceStmt.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/SkipStmt.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/SkipStmt.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/SkipStmt.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/SkipStmt.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/Stmt.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/Stmt.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/Stmt.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/Stmt.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/StmtVisitor.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/StmtVisitor.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/StmtVisitor.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/StmtVisitor.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/Stmts.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/Stmts.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/Stmts.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/Stmts.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/BinaryExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/BinaryExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/BinaryExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/BinaryExpr.kt diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/DomainSize.java b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/DomainSize.java new file mode 100644 index 0000000000..aff9585e46 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/DomainSize.java @@ -0,0 +1,98 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type; + +import static com.google.common.base.Preconditions.checkArgument; + +import com.google.common.base.Objects; +import java.math.BigInteger; +import java.util.function.BinaryOperator; + +public class DomainSize { + + public static final DomainSize INFINITY = new DomainSize(BigInteger.valueOf(-1)); + public static final DomainSize ZERO = of(0); + public static final DomainSize ONE = of(1); + public static final DomainSize TWO = of(2); + private final BigInteger finiteSize; + + private DomainSize(BigInteger value) { + finiteSize = value; + } + + public static DomainSize of(BigInteger val) { + checkArgument(val.signum() != -1, "DomainSize can't be negative"); + return new DomainSize(val); + } + + public static DomainSize of(long val) { + return of(BigInteger.valueOf(val)); + } + + private static DomainSize infiniteForAnyInfiniteApplyElse( + DomainSize left, DomainSize right, BinaryOperator operator) { + if (left.isInfinite() || right.isInfinite()) return INFINITY; + return of(operator.apply(left.finiteSize, right.finiteSize)); + } + + public static DomainSize add(DomainSize left, DomainSize right) { + return infiniteForAnyInfiniteApplyElse(left, right, BigInteger::add); + } + + public static DomainSize multiply(DomainSize left, DomainSize right) { + return infiniteForAnyInfiniteApplyElse(left, right, BigInteger::multiply); + } + + /** + * Raises a domain size to the power of the other. Returns {@link DomainSize#INFINITY} if either + * parameter is infinite or exponent is too large ( = can't fit into an integer) + */ + public static DomainSize pow(DomainSize base, DomainSize exponent) { + if (base.isInfinite() || exponent.isInfinite()) return INFINITY; + int iExp; + try { + iExp = exponent.finiteSize.intValueExact(); + } catch (ArithmeticException exception) { + return INFINITY; + } + return of(base.finiteSize.pow(iExp)); + } + + public boolean isInfinite() { + return equals(INFINITY); + } + + public boolean isBiggerThan(long limit) { + return this.equals(INFINITY) || finiteSize.compareTo(BigInteger.valueOf(limit)) > 0; + } + + public BigInteger getFiniteSize() { + return finiteSize; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + DomainSize that = (DomainSize) o; + return Objects.equal(finiteSize, that.finiteSize); + } + + @Override + public int hashCode() { + return Objects.hashCode(finiteSize); + } +} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/Expr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/Expr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/Expr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/Expr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/LitExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/LitExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/LitExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/LitExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/MultiaryExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/MultiaryExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/MultiaryExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/MultiaryExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/NullaryExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/NullaryExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/NullaryExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/NullaryExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/Type.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/Type.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/Type.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/Type.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/UnaryExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/UnaryExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/UnaryExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/UnaryExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/AbstractExprs.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/AbstractExprs.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/AbstractExprs.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/AbstractExprs.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/AddExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/AddExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/AddExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/AddExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Additive.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/Additive.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Additive.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/Additive.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/CastExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/CastExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/CastExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/CastExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Castable.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/Castable.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Castable.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/Castable.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/DivExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/DivExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/DivExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/DivExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Divisible.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/Divisible.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Divisible.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/Divisible.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/EqExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/EqExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/EqExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/EqExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Equational.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/Equational.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Equational.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/Equational.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/GeqExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/GeqExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/GeqExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/GeqExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/GtExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/GtExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/GtExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/GtExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/LeqExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/LeqExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/LeqExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/LeqExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/LtExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/LtExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/LtExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/LtExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/ModExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/ModExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/ModExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/ModExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/MulExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/MulExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/MulExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/MulExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Multiplicative.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/Multiplicative.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Multiplicative.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/Multiplicative.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/NegExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/NegExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/NegExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/NegExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/NeqExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/NeqExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/NeqExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/NeqExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Ordered.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/Ordered.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/Ordered.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/Ordered.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/PosExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/PosExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/PosExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/PosExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/RemExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/RemExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/RemExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/RemExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/SubExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/SubExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/SubExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/SubExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/package-info.java b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/package-info.java similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/abstracttype/package-info.java rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/abstracttype/package-info.java diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/Dereference.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/Dereference.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/Dereference.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/Dereference.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/Exprs.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/Exprs.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/Exprs.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/Exprs.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/InvalidLitExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/InvalidLitExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/InvalidLitExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/InvalidLitExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/IteExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/IteExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/IteExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/IteExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/PrimeExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/PrimeExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/PrimeExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/PrimeExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/RefExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/RefExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/RefExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/RefExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/Reference.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/Reference.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/Reference.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/Reference.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/package-info.java b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/package-info.java similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/anytype/package-info.java rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/package-info.java diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayEqExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayEqExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayEqExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayEqExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayExprs.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayExprs.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayExprs.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayExprs.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayInitExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayInitExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayInitExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayInitExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayLitExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayLitExpr.kt similarity index 54% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayLitExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayLitExpr.kt index 257fc5ba5f..9a5d2c5121 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayLitExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayLitExpr.kt @@ -22,13 +22,19 @@ import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.LitExpr import hu.bme.mit.theta.core.type.NullaryExpr import hu.bme.mit.theta.core.type.Type +import hu.bme.mit.theta.core.type.generated.typeSerializerModule import hu.bme.mit.theta.core.utils.ExprSimplifier -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable +import kotlinx.serialization.* +import kotlinx.serialization.builtins.ListSerializer +import kotlinx.serialization.builtins.PairSerializer +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.descriptors.buildClassSerialDescriptor +import kotlinx.serialization.descriptors.element +import kotlinx.serialization.encoding.* /** Literal array expression for array types, containing only literal values. */ @Serializable -@SerialName("ArrayLitExpr") +@SerialName("ArrayLit") data class ArrayLitExpr( val elements: List, LitExpr>>, val elseElem: LitExpr, @@ -70,4 +76,41 @@ data class ArrayLitExpr( .addAll(elements.map { "(${it.first} ${it.second})" }) .add("(default $elseElem)") .toString() + + object Serializer : KSerializer> { + override val descriptor: SerialDescriptor = buildClassSerialDescriptor("ArrayLitExpr") { + element("elements") + element("elseElem") + element("type") + } + + override fun serialize(encoder: Encoder, value: ArrayLitExpr) = + encoder.encodeStructure(descriptor) { + encodeSerializableElement(descriptor, 0, ListSerializer(PairSerializer(PolymorphicSerializer(Expr::class), PolymorphicSerializer(Expr::class))), value.elements) + encodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class), value.elseElem) + encodeSerializableElement(descriptor, 2, PolymorphicSerializer(Type::class), value.type) + } + + override fun deserialize(decoder: Decoder): ArrayLitExpr = decoder.decodeStructure(descriptor) { + var elements: List, LitExpr>>? = null + var elseElem: LitExpr? = null + var type: ArrayType? = null + + while (true) { + when (val index = decodeElementIndex(descriptor)) { + 0 -> elements = decodeSerializableElement(descriptor, 0, ListSerializer(PairSerializer(PolymorphicSerializer(Expr::class), PolymorphicSerializer(Expr::class)))) as List, LitExpr>> + 1 -> elseElem = decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class)) as LitExpr + 2 -> type = decodeSerializableElement(descriptor, 2, PolymorphicSerializer(Type::class)) as ArrayType + CompositeDecoder.DECODE_DONE -> break + else -> error("Unexpected index: $index") + } + } + + ArrayLitExpr( + elements = elements ?: error("Missing elements"), + elseElem = elseElem ?: error("Missing elseElem"), + type = type ?: error("Missing type"), + ) + } + } } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayNeqExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayNeqExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayNeqExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayNeqExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayReadExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayReadExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayReadExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayReadExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayType.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayType.kt similarity index 57% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayType.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayType.kt index ccc009702a..eed6e82925 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayType.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayType.kt @@ -22,11 +22,17 @@ import hu.bme.mit.theta.core.type.Type import hu.bme.mit.theta.core.type.abstracttype.EqExpr import hu.bme.mit.theta.core.type.abstracttype.Equational import hu.bme.mit.theta.core.type.abstracttype.NeqExpr +import kotlinx.serialization.KSerializer +import kotlinx.serialization.PolymorphicSerializer import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.descriptors.buildClassSerialDescriptor +import kotlinx.serialization.descriptors.element +import kotlinx.serialization.encoding.* /** Represents an array type with a given index and element type. */ -@Serializable +@Serializable(with = ArrayType.Serializer::class) @SerialName(ArrayType.TYPE_LABEL) data class ArrayType( val indexType: IndexType, @@ -59,4 +65,36 @@ data class ArrayType( override val domainSize: DomainSize get() = DomainSize.pow(elemType.domainSize, indexType.domainSize) + + object Serializer : KSerializer> { + override val descriptor: SerialDescriptor = buildClassSerialDescriptor("ArrayType") { + element("indexType") + element("elemType") + } + + override fun serialize(encoder: Encoder, value: ArrayType) = + encoder.encodeStructure(descriptor) { + encodeSerializableElement(descriptor, 0, PolymorphicSerializer(Type::class), value.indexType) + encodeSerializableElement(descriptor, 1, PolymorphicSerializer(Type::class), value.elemType) + } + + override fun deserialize(decoder: Decoder): ArrayType = decoder.decodeStructure(descriptor) { + var indexType: Type? = null + var elemType: Type? = null + + while (true) { + when (val index = decodeElementIndex(descriptor)) { + 0 -> indexType = decodeSerializableElement(descriptor, 0, PolymorphicSerializer(Type::class)) + 1 -> elemType = decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Type::class)) + CompositeDecoder.DECODE_DONE -> break + else -> error("Unexpected index: $index") + } + } + + ArrayType( + indexType = indexType ?: error("Missing indexType"), + elemType = elemType ?: error("Missing elemType") + ) + } + } } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayWriteExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayWriteExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/ArrayWriteExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayWriteExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/package-info.java b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/package-info.java similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/arraytype/package-info.java rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/package-info.java diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/AndExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/AndExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/AndExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/AndExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/BoolExprs.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/BoolExprs.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/BoolExprs.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/BoolExprs.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/BoolLitExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/BoolLitExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/BoolLitExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/BoolLitExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/BoolType.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/BoolType.kt similarity index 96% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/BoolType.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/BoolType.kt index 348a374f34..8aa20cdb34 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/BoolType.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/BoolType.kt @@ -25,7 +25,7 @@ import kotlinx.serialization.Serializable /** Boolean type for expressions. */ @Serializable @SerialName(BoolType.TYPE_LABEL) -object BoolType : Equational { +data object BoolType : Equational { internal const val TYPE_LABEL = "Bool" diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/IffExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/IffExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/IffExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/IffExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/ImplyExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/ImplyExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/ImplyExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/ImplyExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/NotExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/NotExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/NotExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/NotExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/OrExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/OrExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/OrExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/OrExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/QuantifiedExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/QuantifiedExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/QuantifiedExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/QuantifiedExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/SmartBoolExprs.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/SmartBoolExprs.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/SmartBoolExprs.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/SmartBoolExprs.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/XorExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/XorExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/XorExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/XorExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/package-info.java b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/package-info.java similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/booltype/package-info.java rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/package-info.java diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvAddExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvAddExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvAddExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvAddExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvAndExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvAndExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvAndExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvAndExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvArithShiftRightExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvArithShiftRightExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvArithShiftRightExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvArithShiftRightExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvConcatExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvConcatExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvConcatExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvConcatExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvEqExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvEqExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvEqExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvEqExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvExprs.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvExprs.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvExprs.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvExprs.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvExtractExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvExtractExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvExtractExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvExtractExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvLitExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvLitExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvLitExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvLitExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvLogicShiftRightExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvLogicShiftRightExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvLogicShiftRightExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvLogicShiftRightExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvMulExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvMulExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvMulExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvMulExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvNegExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvNegExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvNegExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvNegExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvNeqExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvNeqExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvNeqExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvNeqExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvNotExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvNotExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvNotExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvNotExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvOrExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvOrExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvOrExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvOrExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvPosExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvPosExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvPosExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvPosExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvRotateLeftExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvRotateLeftExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvRotateLeftExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvRotateLeftExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvRotateRightExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvRotateRightExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvRotateRightExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvRotateRightExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSDivExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSDivExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSDivExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSDivExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSExtExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSExtExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSExtExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSExtExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSGeqExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSGeqExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSGeqExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSGeqExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSGtExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSGtExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSGtExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSGtExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSLeqExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSLeqExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSLeqExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSLeqExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSLtExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSLtExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSLtExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSLtExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSModExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSModExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSModExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSModExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSRemExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSRemExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSRemExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSRemExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvShiftLeftExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvShiftLeftExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvShiftLeftExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvShiftLeftExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSignChangeExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSignChangeExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSignChangeExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSignChangeExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSubExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSubExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvSubExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSubExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvType.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvType.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvType.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvType.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvUDivExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvUDivExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvUDivExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvUDivExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvUGeqExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvUGeqExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvUGeqExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvUGeqExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvUGtExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvUGtExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvUGtExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvUGtExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvULeqExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvULeqExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvULeqExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvULeqExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvULtExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvULtExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvULtExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvULtExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvURemExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvURemExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvURemExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvURemExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvXorExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvXorExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvXorExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvXorExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvZExtExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvZExtExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/BvZExtExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvZExtExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/package-info.java b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/package-info.java similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/bvtype/package-info.java rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/package-info.java diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumEqExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/enumtype/EnumEqExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumEqExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/enumtype/EnumEqExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumLitExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/enumtype/EnumLitExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumLitExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/enumtype/EnumLitExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumNeqExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/enumtype/EnumNeqExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumNeqExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/enumtype/EnumNeqExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumType.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/enumtype/EnumType.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/enumtype/EnumType.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/enumtype/EnumType.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpAbsExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpAbsExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpAbsExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpAbsExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpAddExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpAddExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpAddExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpAddExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpAssignExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpAssignExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpAssignExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpAssignExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpDivExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpDivExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpDivExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpDivExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpEqExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpEqExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpEqExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpEqExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpExprs.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpExprs.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpExprs.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpExprs.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpFromBvExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpFromBvExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpFromBvExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpFromBvExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpGeqExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpGeqExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpGeqExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpGeqExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpGtExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpGtExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpGtExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpGtExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpIsInfiniteExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpIsInfiniteExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpIsInfiniteExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpIsInfiniteExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpIsNanExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpIsNanExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpIsNanExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpIsNanExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpLeqExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpLeqExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpLeqExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpLeqExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpLitExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpLitExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpLitExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpLitExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpLtExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpLtExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpLtExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpLtExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpMaxExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpMaxExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpMaxExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpMaxExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpMinExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpMinExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpMinExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpMinExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpMulExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpMulExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpMulExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpMulExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpNegExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpNegExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpNegExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpNegExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpNeqExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpNeqExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpNeqExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpNeqExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpPosExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpPosExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpPosExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpPosExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpRemExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpRemExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpRemExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpRemExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpRoundToIntegralExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpRoundToIntegralExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpRoundToIntegralExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpRoundToIntegralExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpRoundingMode.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpRoundingMode.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpRoundingMode.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpRoundingMode.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpSqrtExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpSqrtExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpSqrtExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpSqrtExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpSubExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpSubExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpSubExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpSubExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpToBvExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpToBvExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpToBvExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpToBvExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpToFpExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpToFpExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpToFpExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpToFpExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpType.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpType.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/fptype/FpType.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpType.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/functype/FuncAppExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/functype/FuncAppExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/functype/FuncAppExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/functype/FuncAppExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/functype/FuncLitExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/functype/FuncLitExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/functype/FuncLitExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/functype/FuncLitExpr.kt diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/functype/FuncType.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/functype/FuncType.kt new file mode 100644 index 0000000000..1d80bb94b5 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/functype/FuncType.kt @@ -0,0 +1,84 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.type.functype + +import hu.bme.mit.theta.common.Utils +import hu.bme.mit.theta.core.type.DomainSize +import hu.bme.mit.theta.core.type.Type +import kotlinx.serialization.KSerializer +import kotlinx.serialization.PolymorphicSerializer +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.descriptors.buildClassSerialDescriptor +import kotlinx.serialization.descriptors.element +import kotlinx.serialization.encoding.* + +/** Represents a function type from ParamType to ResultType. */ +@Serializable(with = FuncType.Serializer::class) +@SerialName(FuncType.TYPE_LABEL) +data class FuncType( + val paramType: ParamType, + val resultType: ResultType, +) : Type { + + companion object { + + internal const val TYPE_LABEL = "Func" + + @JvmStatic + fun of(paramType: ParamType, resultType: ResultType) = + FuncType(paramType, resultType) + } + + override fun toString(): String = + Utils.lispStringBuilder(TYPE_LABEL).add(paramType).add(resultType).toString() + + override val domainSize: DomainSize + get() = throw UnsupportedOperationException() + + object Serializer : KSerializer> { + override val descriptor: SerialDescriptor = buildClassSerialDescriptor("FuncType") { + element("paramType") + element("resultType") + } + + override fun serialize(encoder: Encoder, value: FuncType) = + encoder.encodeStructure(descriptor) { + encodeSerializableElement(descriptor, 0, PolymorphicSerializer(Type::class), value.paramType) + encodeSerializableElement(descriptor, 1, PolymorphicSerializer(Type::class), value.resultType) + } + + override fun deserialize(decoder: Decoder): FuncType = decoder.decodeStructure(descriptor) { + var paramType: Type? = null + var resultType: Type? = null + + while (true) { + when (val index = decodeElementIndex(descriptor)) { + 0 -> paramType = decodeSerializableElement(descriptor, 0, PolymorphicSerializer(Type::class)) + 1 -> resultType = decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Type::class)) + CompositeDecoder.DECODE_DONE -> break + else -> error("Unexpected index: $index") + } + } + + FuncType( + paramType = paramType ?: error("Missing paramType"), + resultType = resultType ?: error("Missing resultType") + ) + } + } +} diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntAddExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntAddExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntAddExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntAddExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntDivExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntDivExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntDivExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntDivExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntEqExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntEqExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntEqExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntEqExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntExprs.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntExprs.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntExprs.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntExprs.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntGeqExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntGeqExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntGeqExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntGeqExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntGtExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntGtExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntGtExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntGtExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLeqExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntLeqExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLeqExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntLeqExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLitExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntLitExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLitExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntLitExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLtExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntLtExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntLtExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntLtExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntModExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntModExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntModExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntModExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntMulExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntMulExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntMulExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntMulExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntNegExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntNegExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntNegExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntNegExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntNeqExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntNeqExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntNeqExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntNeqExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntPosExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntPosExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntPosExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntPosExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntRemExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntRemExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntRemExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntRemExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntSubExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntSubExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntSubExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntSubExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntToRatExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntToRatExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntToRatExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntToRatExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntType.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntType.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/IntType.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/IntType.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/package-info.java b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/package-info.java similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/inttype/package-info.java rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/inttype/package-info.java diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/package-info.java b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/package-info.java new file mode 100644 index 0000000000..c6dd8f7007 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/package-info.java @@ -0,0 +1,34 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * This package contains types (e.g., Boolean, integer) and expressions operating over them (e.g., + * Boolean connectives, arithmetic operations), grouped into subpackages. Constructors of the types + * and expressions are usually package private. Use the factory classes instead. + * + *

- {@link hu.bme.mit.theta.core.type.Expr} is the main interface for expressions. + * + *

- {@link hu.bme.mit.theta.core.type.anytype} and {@link + * hu.bme.mit.theta.core.type.abstracttype} are expressions for multiple types (e.g., conditional). + * - {@link hu.bme.mit.theta.core.type.booltype} contains the Boolean type and expressions (e.g., + * and, or). - {@link hu.bme.mit.theta.core.type.bvtype} contains the (SMT) bitvector type and + * expressions (e.g., bitwise and, shifts). - {@link hu.bme.mit.theta.core.type.inttype} contains + * the mathematical (SMT) integer type and expressions (e.g., add, multiply). - {@link + * hu.bme.mit.theta.core.type.rattype} contains the rational type and expression (e.g., division). - + * {@link hu.bme.mit.theta.core.type.arraytype} contains the SMT array type (associative mapping + * from a key type to a value type) and expressions (e.g., read, write). - {@link + * hu.bme.mit.theta.core.type.functype} contains the function type and expressions. + */ +package hu.bme.mit.theta.core.type; diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatAddExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatAddExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatAddExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatAddExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatDivExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatDivExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatDivExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatDivExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatEqExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatEqExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatEqExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatEqExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatExprs.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatExprs.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatExprs.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatExprs.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatGeqExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatGeqExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatGeqExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatGeqExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatGtExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatGtExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatGtExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatGtExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatLeqExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatLeqExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatLeqExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatLeqExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatLitExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatLitExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatLitExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatLitExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatLtExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatLtExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatLtExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatLtExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatMulExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatMulExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatMulExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatMulExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatNegExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatNegExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatNegExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatNegExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatNeqExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatNeqExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatNeqExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatNeqExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatPosExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatPosExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatPosExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatPosExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatSubExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatSubExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatSubExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatSubExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatToIntExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatToIntExpr.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatToIntExpr.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatToIntExpr.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatType.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatType.kt similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/RatType.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatType.kt diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/package-info.java b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/package-info.java similarity index 100% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/rattype/package-info.java rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/package-info.java diff --git a/subprojects/common/core/src/test/kotlin/hu/bme/mit/theta/core/serialization/StmtSerializationTest.kt b/subprojects/common/core/src/test/kotlin/hu/bme/mit/theta/core/serialization/StmtSerializationTest.kt new file mode 100644 index 0000000000..00e475bf0e --- /dev/null +++ b/subprojects/common/core/src/test/kotlin/hu/bme/mit/theta/core/serialization/StmtSerializationTest.kt @@ -0,0 +1,141 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package hu.bme.mit.theta.core.serialization + +import hu.bme.mit.theta.core.decl.Decls +import hu.bme.mit.theta.core.stmt.* +//import hu.bme.mit.theta.core.stmt.generated.stmtSerializer +import hu.bme.mit.theta.core.type.anytype.Dereference +import hu.bme.mit.theta.core.type.inttype.IntExprs.Eq +import hu.bme.mit.theta.core.type.inttype.IntExprs.Int +import kotlinx.serialization.encodeToString +import kotlinx.serialization.json.Json +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.Test + +class StmtSerializationTest { + + private val json = Json { +// serializersModule = stmtSerializer + classDiscriminator = "type" + } + + @Test + fun `test AssignStmt serialization`() { + val x = Decls.Var("x", Int()) + val original: Stmt = AssignStmt(x, Int(42)) + val serialized = json.encodeToString(original) + val deserialized = json.decodeFromString(serialized) + assertEquals(original, deserialized) + assertEquals("x", (deserialized as AssignStmt<*>).varDecl.name) + } + + @Test + fun `test AssumeStmt serialization`() { + val x = Decls.Var("x", Int()) + val cond = Eq(x.ref, Int(42)) + val original: Stmt = AssumeStmt(cond) + val serialized = json.encodeToString(original) + val deserialized = json.decodeFromString(serialized) + assertEquals(original, deserialized) + assertEquals("(= x 42)", (deserialized as AssumeStmt).cond.toString()) + } + + @Test + fun `test HavocStmt serialization`() { + val x = Decls.Var("x", Int()) + val original: Stmt = HavocStmt(x) + val serialized = json.encodeToString(original) + val deserialized = json.decodeFromString(serialized) + assertEquals(original, deserialized) + assertEquals("x", (deserialized as HavocStmt<*>).varDecl.name) + } + + @Test + fun `test IfStmt serialization`() { + val x = Decls.Var("x", Int()) + val cond = Eq(x.ref, Int(42)) + val thenStmt: Stmt = AssignStmt(x, Int(1)) + val elseStmt: Stmt = AssignStmt(x, Int(0)) + val original: Stmt = IfStmt(cond, thenStmt, elseStmt) + val serialized = json.encodeToString(original) + val deserialized = json.decodeFromString(serialized) + assertEquals(original, deserialized) + } + + @Test + fun `test LoopStmt serialization`() { + val i = Decls.Var("i", Int()) + val x = Decls.Var("x", Int()) + val stmt: Stmt = AssignStmt(x, Int(1)) + val original: Stmt = LoopStmt(stmt, i, Int(0), Int(42)) + val serialized = json.encodeToString(original) + val deserialized = json.decodeFromString(serialized) + assertEquals(original, deserialized) + } + + @Test + fun `test MemoryAssignStmt serialization`() { + val dereference = Dereference(Decls.Var("ptr", Int()).ref, Int(0), Int()) + val original: Stmt = MemoryAssignStmt(dereference, Int(42)) + val serialized = json.encodeToString(original) + val deserialized = json.decodeFromString(serialized) + assertEquals(original, deserialized) + } + + @Test + fun `test NonDetStmt serialization`() { + val s1 = AssignStmt(Decls.Var("x", Int()), Int(1)) + val s2 = AssignStmt(Decls.Var("y", Int()), Int(2)) + val s3 = SkipStmt + val original: Stmt = NonDetStmt(listOf(s1, s2, s3)) + val serialized = json.encodeToString(original) + val deserialized = json.decodeFromString(serialized) + assertEquals(original, deserialized) + } + + @Test + fun `test OrtStmt serialization`() { + val s1 = AssignStmt(Decls.Var("x", Int()), Int(1)) + val s2 = AssignStmt(Decls.Var("y", Int()), Int(2)) + val s3 = SkipStmt + val original: Stmt = OrtStmt(listOf(s1, s2, s3)) + val serialized = json.encodeToString(original) + val deserialized = json.decodeFromString(serialized) + assertEquals(original, deserialized) + } + + @Test + fun `test SequenceStmt serialization`() { + val s1 = AssignStmt(Decls.Var("x", Int()), Int(1)) + val s2 = AssignStmt(Decls.Var("y", Int()), Int(2)) + val s3 = SkipStmt + val original: Stmt = SequenceStmt(listOf(s1, s2, s3)) + val serialized = json.encodeToString(original) + val deserialized = json.decodeFromString(serialized) + assertEquals(original, deserialized) + } + + @Test + fun `test SkipStmt serialization`() { + val original: Stmt = SkipStmt + val serialized = json.encodeToString(original) + val deserialized = json.decodeFromString(serialized) + assertEquals(original, deserialized) + } +} + diff --git a/subprojects/common/core/src/test/kotlin/hu/bme/mit/theta/core/serialization/TypeSerializationTest.kt b/subprojects/common/core/src/test/kotlin/hu/bme/mit/theta/core/serialization/TypeSerializationTest.kt new file mode 100644 index 0000000000..3a66e5e0e4 --- /dev/null +++ b/subprojects/common/core/src/test/kotlin/hu/bme/mit/theta/core/serialization/TypeSerializationTest.kt @@ -0,0 +1,161 @@ +package hu.bme.mit.theta.core.serialization + +import hu.bme.mit.theta.core.type.Type +import hu.bme.mit.theta.core.type.arraytype.ArrayType +import hu.bme.mit.theta.core.type.booltype.BoolType +import hu.bme.mit.theta.core.type.bvtype.BvType +import hu.bme.mit.theta.core.type.enumtype.EnumType +import hu.bme.mit.theta.core.type.fptype.FpType +import hu.bme.mit.theta.core.type.functype.FuncType +import hu.bme.mit.theta.core.type.inttype.IntType +import hu.bme.mit.theta.core.type.rattype.RatType +import kotlinx.serialization.SerializationException +import kotlinx.serialization.encodeToString +import kotlinx.serialization.json.Json +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.assertDoesNotThrow +import org.junit.jupiter.api.assertThrows +import org.junit.jupiter.params.ParameterizedTest +import org.junit.jupiter.params.provider.Arguments +import org.junit.jupiter.params.provider.MethodSource + +class TypeSerializationTest { + + companion object { + + private val json = Json { + serializersModule = typeSerializerModule + classDiscriminator = "type" + } + + @JvmStatic + val bvTypeTestData: List = listOf( + Arguments.of(42, true), + Arguments.of(1, false), + Arguments.of(8, null), + ) + } + + @Test + fun `test BoolType serialization`() { + val original: Type = BoolType + val serialized = json.encodeToString(original) + val deserialized = json.decodeFromString(serialized) + assertEquals(original, deserialized) + } + + @Test + fun `test IntType serialization`() { + val original: Type = IntType + val serialized = json.encodeToString(original) + val deserialized = json.decodeFromString(serialized) + assertEquals(original, deserialized) + } + + @ParameterizedTest + @MethodSource("getBvTypeTestData") + fun `test BvType serialization`(size: Int, signed: Boolean?) { + val original: Type = BvType(size, signed) + val serialized = json.encodeToString(original) + val deserialized = json.decodeFromString(serialized) + assertEquals(original, deserialized) + val deserializedBvType = deserialized as BvType + assertEquals(size, deserializedBvType.size) + } + + @Test + fun `test ArrayType serialization`() { + val original: Type = ArrayType(BoolType, IntType) + val serialized = json.encodeToString(original) + val deserialized = json.decodeFromString(serialized) + assertEquals(original, deserialized) + + val complex: Type = ArrayType( + indexType = BvType(8, false), + elemType = ArrayType( + indexType = ArrayType(IntType, RatType), + elemType = BoolType, + ) + ) + val complexSerialized = json.encodeToString(complex) + val complexDeserialized = json.decodeFromString(complexSerialized) + assertEquals(complex, complexDeserialized) + assertDoesNotThrow { + complexDeserialized as ArrayType, BoolType>> + } + assertThrows { + (complexDeserialized as ArrayType).elemType.size + } + } + + @Test + fun `test FuncType serialization`() { + val original: Type = FuncType(IntType, BoolType) + val serialized = json.encodeToString(original) + val deserialized = json.decodeFromString(serialized) + assertEquals(original, deserialized) + } + + @Test + fun `test FpType serialization`() { + val original: Type = FpType(8, 24) + val serialized = json.encodeToString(original) + val deserialized = json.decodeFromString(serialized) + assertEquals(original, deserialized) + } + + @Test + fun `test RatType serialization`() { + val original: Type = RatType + val serialized = json.encodeToString(original) + val deserialized = json.decodeFromString(serialized) + assertEquals(original, deserialized) + } + + @Test + fun `test EnumType serialization`() { + val original: Type = EnumType.of("Color", listOf("Red", "Green", "Blue")) + val serialized = json.encodeToString(original) + val deserialized = json.decodeFromString(serialized) + assertEquals(original, deserialized) + } + + @Test + fun `test heterogeneous Type collection serialization`() { + val original: List = listOf( + BoolType, + IntType, + BvType(8, true), + ArrayType(BoolType, IntType), + FuncType(IntType, BoolType), + FpType(8, 24), + RatType, + EnumType.of("Color", listOf("Red", "Green", "Blue")) + ) + val serialized = json.encodeToString(original) + val deserialized = json.decodeFromString>(serialized) + assertEquals(original, deserialized) + } + + @Test + fun `test specific serializer must ignore type field`() { + val original: Type = BvType(8, true) + val serialized = json.encodeToString(original) + assertDoesNotThrow { + (json.decodeFromString(serialized) as BvType).size + } + assertThrows { + json.decodeFromString(serialized).size + } + + val jsonIgnoreUnknownKey = Json { + serializersModule = typeSerializerModule + classDiscriminator = "type" + ignoreUnknownKeys = true + } + assertDoesNotThrow { + jsonIgnoreUnknownKey.decodeFromString(serialized).size + } + } +} diff --git a/subprojects/common/ksp-processor/README.md b/subprojects/common/ksp-processor/README.md new file mode 100644 index 0000000000..f5b8f87759 --- /dev/null +++ b/subprojects/common/ksp-processor/README.md @@ -0,0 +1 @@ +KSP processor module \ No newline at end of file diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/package-info.java b/subprojects/common/ksp-processor/build.gradle.kts similarity index 71% rename from subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/package-info.java rename to subprojects/common/ksp-processor/build.gradle.kts index cec1737dad..3e46a5b11d 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/stmt/package-info.java +++ b/subprojects/common/ksp-processor/build.gradle.kts @@ -13,9 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -/** - * This package contains statements (e.g., assignment, assume). Constructors of the statements are - * usually package private, use the factory class {@link hu.bme.mit.theta.core.stmt.Stmts} to - * instantiate them. - */ -package hu.bme.mit.theta.core.stmt; +plugins { + kotlin("jvm") +} + +dependencies { + implementation("com.google.devtools.ksp:symbol-processing-api:1.9.25-1.0.20") +} diff --git a/subprojects/common/ksp-processor/src/main/kotlin/hu/bme/mit/theta/ksp/PolymorphicModuleProcessor.kt b/subprojects/common/ksp-processor/src/main/kotlin/hu/bme/mit/theta/ksp/PolymorphicModuleProcessor.kt new file mode 100644 index 0000000000..cd3c209b06 --- /dev/null +++ b/subprojects/common/ksp-processor/src/main/kotlin/hu/bme/mit/theta/ksp/PolymorphicModuleProcessor.kt @@ -0,0 +1,146 @@ +package hu.bme.mit.theta.ksp + +import com.google.devtools.ksp.getAllSuperTypes +import com.google.devtools.ksp.isAbstract +import com.google.devtools.ksp.processing.* +import com.google.devtools.ksp.symbol.* + +class PolymorphicModuleProcessor( + private val codeGenerator: CodeGenerator, + private val logger: KSPLogger, + private val pack: String, + private val topLevelClass: String, +) : SymbolProcessor { + + override fun process(resolver: Resolver): List { + val topLevelClassFqn = "$pack.$topLevelClass" + val generatedPack = "$pack.generated" + + val subclasses = resolver + .getSymbolsWithAnnotation("kotlinx.serialization.Serializable") + .filterIsInstance() + .filter { !it.isAbstract() } + .filter { + val allSuperTypes = it.getAllSuperTypes() + allSuperTypes.any { superType -> + superType.declaration.qualifiedName?.asString() == topLevelClassFqn + } + } + .toList() + + if (subclasses.isEmpty()) return emptyList() + + val file = codeGenerator.createNewFile( + Dependencies(false), + generatedPack, + "${topLevelClass}Serializer" + ) + + file.bufferedWriter().use { writer -> + writer.write("package $generatedPack\n\n") + writer.write("import kotlinx.serialization.KSerializer\n") + writer.write("import kotlinx.serialization.PolymorphicSerializer\n") + writer.write("import kotlinx.serialization.descriptors.SerialDescriptor\n") + writer.write("import kotlinx.serialization.descriptors.buildClassSerialDescriptor\n") + writer.write("import kotlinx.serialization.descriptors.element\n") + writer.write("import kotlinx.serialization.encoding.*\n") + writer.write("import kotlinx.serialization.modules.SerializersModule\n") + writer.write("import kotlinx.serialization.modules.polymorphic\n") + writer.write("import kotlinx.serialization.modules.subclass\n") + writer.write("import $topLevelClassFqn\n") + + subclasses.forEach { subclass -> + writer.write("import ${subclass.qualifiedName?.asString()}\n") + } + + writer.write( + "\nval ${topLevelClass.replaceFirstChar { it.lowercase() }}SerializerModule = SerializersModule {\n" + ) + writer.write(" polymorphic($topLevelClass::class) {\n") + + subclasses.forEach { subclass -> + val serializer = subclass.annotations.firstOrNull { + it.shortName.getShortName() == "Serializable" + }?.arguments?.find { it.name?.asString() == "with" }?.let { with -> + (with.value as? KSType)?.declaration?.qualifiedName?.asString()?.let { + if (it == "kotlinx.serialization.KSerializer") null else it + } + } + + val name = subclass.simpleName.asString() + if (serializer == null) { + writer.write(" subclass($name::class)\n") + } else { + writer.write(" subclass($name::class, $serializer)\n") + } + } + writer.write(" }\n") + writer.write("}\n") + + subclasses.filter { it.typeParameters.isNotEmpty() }.forEach { subclass -> + val name = subclass.simpleName.asString() + logger.warn("$name -> ${subclass.typeParameters[0].bounds.toList()}") + val typeParams = subclass.typeParameters.joinToString(", ") { + val bounds = it.bounds.toList() + require(bounds.size <= 1) { + "Serializer class generation: multiple bounds not supported for type parameters." + } + "out ${bounds.firstOrNull()?.toString() ?: "Any?"}" + } + + writer.write("\n\nclass ${name}Serializer : KSerializer<$name<$typeParams>> {\n\n") + writer.write( + " override val descriptor: SerialDescriptor = buildClassSerialDescriptor(\"$name\") {\n" + ) + + val parameters = subclass.primaryConstructor!!.parameters.map { parameter -> + val typeName = parameter.type.toString() + val type = subclass.typeParameters.find { it.name.asString() == typeName }?.bounds?.firstOrNull() + ?: typeName + parameter.name!!.asString() to type + } + parameters.forEach { (name, _) -> + writer.write(" element(\"$name\")\n") + } + writer.write(" }\n\n") + + writer.write(" override fun serialize(encoder: Encoder, value: $name<$typeParams>) =\n") + writer.write(" encoder.encodeStructure(descriptor) {\n") + parameters.forEachIndexed { index, (name, type) -> + writer.write( + " encodeSerializableElement(descriptor, $index, PolymorphicSerializer($type::class), value.$name)\n" + ) + } + writer.write(" }\n") + + writer.write( + " override fun deserialize(decoder: Decoder): $name<$typeParams> = decoder.decodeStructure(descriptor) {\n" + ) + parameters.forEach { (name, type) -> + writer.write(" var $name: $type? = null\n") + } + writer.write(" while (true) {\n") + writer.write(" when (val index = decodeElementIndex(descriptor)) {\n") + parameters.forEachIndexed { index, (name, type) -> + writer.write( + " $index -> $name = decodeSerializableElement(descriptor, 0, PolymorphicSerializer($type::class))\n" + ) + } + writer.write(" CompositeDecoder.DECODE_DONE -> break\n") + writer.write(" else -> error(\"Unexpected index: \$index\")") + writer.write(" }\n") + writer.write(" }\n") + writer.write(" $name(\n") + parameters.forEach { (name, _) -> + writer.write(" $name = $name ?: error(\"Missing $name\"),\n") + } + writer.write(" )\n") + writer.write(" }\n") + + writer.write("}\n") + } + } + + return emptyList() + } +} \ No newline at end of file diff --git a/subprojects/common/ksp-processor/src/main/kotlin/hu/bme/mit/theta/ksp/PolymorphicModuleProcessorProvider.kt b/subprojects/common/ksp-processor/src/main/kotlin/hu/bme/mit/theta/ksp/PolymorphicModuleProcessorProvider.kt new file mode 100644 index 0000000000..2b502a9dd8 --- /dev/null +++ b/subprojects/common/ksp-processor/src/main/kotlin/hu/bme/mit/theta/ksp/PolymorphicModuleProcessorProvider.kt @@ -0,0 +1,20 @@ +package hu.bme.mit.theta.ksp + +import com.google.devtools.ksp.processing.* + +sealed class PolymorphicModuleProcessorProvider( + private val pack: String, + private val topLevelClass: String, +) : SymbolProcessorProvider { + override fun create(environment: SymbolProcessorEnvironment): SymbolProcessor = + PolymorphicModuleProcessor(environment.codeGenerator, environment.logger, pack, topLevelClass) +} + +class TypeSerializerProcessorProvider : + PolymorphicModuleProcessorProvider("hu.bme.mit.theta.core.type", "Type") + +class StmtSerializerProcessorProvider : + PolymorphicModuleProcessorProvider("hu.bme.mit.theta.core.stmt", "Stmt") + +class ExprSerializerProcessorProvider : + PolymorphicModuleProcessorProvider("hu.bme.mit.theta.core.type", "Expr") diff --git a/subprojects/common/ksp-processor/src/main/resources/META-INF/services/com.google.devtools.ksp.processing.SymbolProcessorProvider b/subprojects/common/ksp-processor/src/main/resources/META-INF/services/com.google.devtools.ksp.processing.SymbolProcessorProvider new file mode 100644 index 0000000000..1bb1650532 --- /dev/null +++ b/subprojects/common/ksp-processor/src/main/resources/META-INF/services/com.google.devtools.ksp.processing.SymbolProcessorProvider @@ -0,0 +1,3 @@ +hu.bme.mit.theta.ksp.TypeSerializerProcessorProvider +hu.bme.mit.theta.ksp.StmtSerializerProcessorProvider +hu.bme.mit.theta.ksp.ExprSerializerProcessorProvider \ No newline at end of file From 6287751f712fca922e7c19c1c670a3f88e5e8877 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Csan=C3=A1d=20Telbisz?= Date: Thu, 26 Jun 2025 13:48:56 +0200 Subject: [PATCH 29/48] serializers for generic subclasses --- .../bme/mit/theta/core/decl/BasicConstDecl.kt | 45 +++++- .../mit/theta/core/decl/IndexedConstDecl.kt | 61 +++++++-- .../hu/bme/mit/theta/core/decl/ParamDecl.kt | 54 +++++++- .../hu/bme/mit/theta/core/decl/VarDecl.kt | 69 +++++++--- .../core/serialization/GenericSerializer.kt | 59 -------- ...erializerModule.kt => SerializerModule.kt} | 33 +++-- .../bme/mit/theta/core/serialization/Test.kt | 128 ------------------ .../serialization/TypeSerializerModule.kt | 48 ------- .../hu/bme/mit/theta/core/stmt/AssignStmt.kt | 40 +++++- .../hu/bme/mit/theta/core/stmt/AssumeStmt.kt | 33 ++++- .../hu/bme/mit/theta/core/stmt/HavocStmt.kt | 32 ++++- .../mit/theta/core/stmt/MemoryAssignStmt.kt | 38 +++++- .../theta/core/type/anytype/Dereference.kt | 54 +++++++- .../theta/core/type/anytype/InvalidLitExpr.kt | 32 ++++- .../mit/theta/core/type/anytype/IteExpr.kt | 43 +++++- .../mit/theta/core/type/anytype/PrimeExpr.kt | 33 ++++- .../mit/theta/core/type/anytype/RefExpr.kt | 33 ++++- .../mit/theta/core/type/anytype/Reference.kt | 41 +++++- .../theta/core/type/arraytype/ArrayEqExpr.kt | 40 +++++- .../core/type/arraytype/ArrayInitExpr.kt | 45 +++++- .../theta/core/type/arraytype/ArrayLitExpr.kt | 10 +- .../theta/core/type/arraytype/ArrayNeqExpr.kt | 40 +++++- .../core/type/arraytype/ArrayReadExpr.kt | 40 +++++- .../core/type/arraytype/ArrayWriteExpr.kt | 45 +++++- .../theta/core/type/enumtype/EnumEqExpr.kt | 2 +- .../theta/core/type/enumtype/EnumLitExpr.kt | 2 +- .../theta/core/type/enumtype/EnumNeqExpr.kt | 2 +- .../theta/core/type/functype/FuncAppExpr.kt | 40 +++++- .../theta/core/type/functype/FuncLitExpr.kt | 40 +++++- .../serialization/StmtSerializationTest.kt | 8 +- .../serialization/TypeSerializationTest.kt | 25 +++- .../theta/ksp/PolymorphicModuleProcessor.kt | 81 +---------- .../ksp/PolymorphicModuleProcessorProvider.kt | 7 +- ...ols.ksp.processing.SymbolProcessorProvider | 1 + 34 files changed, 859 insertions(+), 445 deletions(-) delete mode 100644 subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/serialization/GenericSerializer.kt rename subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/serialization/{StmtSerializerModule.kt => SerializerModule.kt} (55%) delete mode 100644 subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/serialization/Test.kt delete mode 100644 subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/serialization/TypeSerializerModule.kt diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/BasicConstDecl.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/BasicConstDecl.kt index d54d1e9755..3629054218 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/BasicConstDecl.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/BasicConstDecl.kt @@ -16,15 +16,56 @@ package hu.bme.mit.theta.core.decl import hu.bme.mit.theta.core.type.Type +import kotlinx.serialization.KSerializer +import kotlinx.serialization.PolymorphicSerializer import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.descriptors.buildClassSerialDescriptor +import kotlinx.serialization.descriptors.element +import kotlinx.serialization.encoding.* /** * A basic constant declaration that can be directly passed to the SMT solver. * * @param */ -@Serializable +@Serializable(with = BasicConstDecl.Serializer::class) @SerialName("BasicConstDecl") data class BasicConstDecl(override val name: String, override val type: DeclType) : - ConstDecl() + ConstDecl() { + + object Serializer : KSerializer> { + + override val descriptor: SerialDescriptor = buildClassSerialDescriptor("BasicConstDecl") { + element("name") + element("type") + } + + override fun serialize(encoder: Encoder, value: BasicConstDecl) = + encoder.encodeStructure(descriptor) { + encodeStringElement(descriptor, 0, value.name) + encodeSerializableElement(descriptor, 1, PolymorphicSerializer(Type::class), value.type) + } + + override fun deserialize(decoder: Decoder): BasicConstDecl = + decoder.decodeStructure(descriptor) { + var name: String? = null + var type: Type? = null + + while (true) { + when (val index = decodeElementIndex(descriptor)) { + 0 -> name = decodeStringElement(descriptor, 0) + 1 -> type = decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Type::class)) + CompositeDecoder.DECODE_DONE -> break + else -> error("Unexpected index: $index") + } + } + + BasicConstDecl( + name = name ?: error("Missing name"), + type = type ?: error("Missing type") + ) + } + } +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/IndexedConstDecl.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/IndexedConstDecl.kt index e3b8a451fb..bf554bee02 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/IndexedConstDecl.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/IndexedConstDecl.kt @@ -16,8 +16,11 @@ package hu.bme.mit.theta.core.decl import hu.bme.mit.theta.core.type.Type -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable +import kotlinx.serialization.* +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.descriptors.buildClassSerialDescriptor +import kotlinx.serialization.descriptors.element +import kotlinx.serialization.encoding.* /** * A constant declaration that belongs to a variable ([VarDecl] declaration for a given index. For @@ -25,18 +28,52 @@ import kotlinx.serialization.Serializable * * @param */ -@Serializable +@Serializable(with = IndexedConstDecl.Serializer::class) @SerialName("IndexedConstDecl") data class IndexedConstDecl(val varDecl: VarDecl, val index: Int) : - ConstDecl() { - init { - require(index >= 0) { "Index must be non-negative" } - } + ConstDecl() { - companion object { - private const val NAME_FORMAT: String = "_%s:%d" - } + init { + require(index >= 0) { "Index must be non-negative" } + } - override val name: String = String.format(NAME_FORMAT, varDecl.name, index) - override val type: DeclType = varDecl.type + companion object { + + private const val NAME_FORMAT: String = "_%s:%d" + } + + override val name: String = String.format(NAME_FORMAT, varDecl.name, index) + override val type: DeclType = varDecl.type + + object Serializer : KSerializer> { + + override val descriptor: SerialDescriptor = buildClassSerialDescriptor("IndexedConstDecl") { + element>("varDecl") + element("index") + } + + override fun serialize(encoder: Encoder, value: IndexedConstDecl) = + encoder.encodeStructure(descriptor) { + encodeSerializableElement(descriptor, 0, VarDecl.Serializer, value.varDecl) + encodeIntElement(descriptor, 1, value.index) + } + + override fun deserialize(decoder: Decoder): IndexedConstDecl = + decoder.decodeStructure(descriptor) { + var varDecl: VarDecl? = null + var index: Int? = null + while (true) { + when (val i = decodeElementIndex(descriptor)) { + 0 -> varDecl = decodeSerializableElement(descriptor, 0, VarDecl.Serializer) + 1 -> index = decodeIntElement(descriptor, 1) + CompositeDecoder.DECODE_DONE -> break + else -> throw SerializationException("Unknown index $i") + } + } + IndexedConstDecl( + varDecl = varDecl ?: error("Missing varDecl"), + index = index ?: error("Missing index"), + ) + } + } } diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/ParamDecl.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/ParamDecl.kt index 8fc7bd802b..9787150b9a 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/ParamDecl.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/ParamDecl.kt @@ -17,19 +17,59 @@ package hu.bme.mit.theta.core.decl import hu.bme.mit.theta.common.Utils import hu.bme.mit.theta.core.type.Type +import kotlinx.serialization.KSerializer +import kotlinx.serialization.PolymorphicSerializer import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.descriptors.buildClassSerialDescriptor +import kotlinx.serialization.descriptors.element +import kotlinx.serialization.encoding.* -@Serializable +@Serializable(with = ParamDecl.Serializer::class) @SerialName(ParamDecl.DECL_LABEL) data class ParamDecl(override val name: String, override val type: DeclType) : - Decl() { + Decl() { - companion object { + companion object { - internal const val DECL_LABEL: String = "Param" - } + internal const val DECL_LABEL: String = "Param" + } - override fun toString(): String = - Utils.lispStringBuilder(DECL_LABEL).add(name).add(type).toString() + override fun toString(): String = + Utils.lispStringBuilder(DECL_LABEL).add(name).add(type).toString() + + object Serializer : KSerializer> { + + override val descriptor: SerialDescriptor = buildClassSerialDescriptor("ParamDecl") { + element("name") + element("type") + } + + override fun serialize(encoder: Encoder, value: ParamDecl) = + encoder.encodeStructure(descriptor) { + encodeStringElement(descriptor, 0, value.name) + encodeSerializableElement(descriptor, 1, PolymorphicSerializer(Type::class), value.type) + } + + override fun deserialize(decoder: Decoder): ParamDecl = + decoder.decodeStructure(descriptor) { + var name: String? = null + var type: Type? = null + + while (true) { + when (val index = decodeElementIndex(descriptor)) { + 0 -> name = decodeStringElement(descriptor, 0) + 1 -> type = decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Type::class)) + CompositeDecoder.DECODE_DONE -> break + else -> error("Unexpected index: $index") + } + } + + ParamDecl( + name = name ?: error("Missing name"), + type = type ?: error("Missing type") + ) + } + } } diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/VarDecl.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/VarDecl.kt index f6d3cbe58c..440a31d9f1 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/VarDecl.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/VarDecl.kt @@ -17,9 +17,11 @@ package hu.bme.mit.theta.core.decl import hu.bme.mit.theta.common.Utils import hu.bme.mit.theta.core.type.Type -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable -import kotlinx.serialization.Transient +import kotlinx.serialization.* +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.descriptors.buildClassSerialDescriptor +import kotlinx.serialization.descriptors.element +import kotlinx.serialization.encoding.* /** * Represents a variable declaration. Variables cannot be directly passed to the SMT solver, they @@ -28,25 +30,60 @@ import kotlinx.serialization.Transient * * @param */ -@Serializable +@Serializable(with = VarDecl.Serializer::class) @SerialName(VarDecl.DECL_LABEL) data class VarDecl(override val name: String, override val type: DeclType) : - Decl() { + Decl() { - companion object { + companion object { - internal const val DECL_LABEL: String = "var" + internal const val DECL_LABEL: String = "var" - fun copyOf(from: VarDecl): VarDecl = VarDecl(from.name, from.type) - } + fun copyOf(from: VarDecl): VarDecl = VarDecl(from.name, from.type) + } - @Transient private val indexToConst = mutableMapOf>() + @Transient + private val indexToConst = mutableMapOf>() - fun getConstDecl(index: Int): IndexedConstDecl { - require(index >= 0) { "Index must be non-negative" } - return indexToConst.getOrPut(index) { IndexedConstDecl(this, index) } - } + fun getConstDecl(index: Int): IndexedConstDecl { + require(index >= 0) { "Index must be non-negative" } + return indexToConst.getOrPut(index) { IndexedConstDecl(this, index) } + } - override fun toString(): String = - Utils.lispStringBuilder(DECL_LABEL).add(name).add(type).toString() + override fun toString(): String = + Utils.lispStringBuilder(DECL_LABEL).add(name).add(type).toString() + + object Serializer : KSerializer> { + + override val descriptor: SerialDescriptor = buildClassSerialDescriptor("VarDecl") { + element("name") + element("type") + } + + override fun serialize(encoder: Encoder, value: VarDecl) = + encoder.encodeStructure(descriptor) { + encodeStringElement(descriptor, 0, value.name) + encodeSerializableElement(descriptor, 1, PolymorphicSerializer(Type::class), value.type) + } + + override fun deserialize(decoder: Decoder): VarDecl = + decoder.decodeStructure(descriptor) { + var name: String? = null + var type: Type? = null + + while (true) { + when (val index = decodeElementIndex(descriptor)) { + 0 -> name = decodeStringElement(descriptor, 0) + 1 -> type = decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Type::class)) + CompositeDecoder.DECODE_DONE -> break + else -> error("Unexpected index: $index") + } + } + + VarDecl( + name = name ?: error("Missing name"), + type = type ?: error("Missing type") + ) + } + } } diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/serialization/GenericSerializer.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/serialization/GenericSerializer.kt deleted file mode 100644 index bbfaafe47e..0000000000 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/serialization/GenericSerializer.kt +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package hu.bme.mit.theta.core.serialization - -import hu.bme.mit.theta.core.type.Type -import hu.bme.mit.theta.core.type.arraytype.ArrayType -import kotlinx.serialization.KSerializer -import kotlinx.serialization.PolymorphicSerializer -import kotlinx.serialization.descriptors.SerialDescriptor -import kotlinx.serialization.descriptors.buildClassSerialDescriptor -import kotlinx.serialization.descriptors.element -import kotlinx.serialization.encoding.* - -class ArrayTypeSerializer : KSerializer> { - - override val descriptor: SerialDescriptor = buildClassSerialDescriptor("ArrayType") { - element("indexType") - element("elemType") - } - - override fun serialize(encoder: Encoder, value: ArrayType) = - encoder.encodeStructure(descriptor) { - encodeSerializableElement(descriptor, 0, PolymorphicSerializer(Type::class), value.indexType) - encodeSerializableElement(descriptor, 1, PolymorphicSerializer(Type::class), value.elemType) - } - - override fun deserialize(decoder: Decoder): ArrayType = decoder.decodeStructure(descriptor) { - var indexType: Type? = null - var elemType: Type? = null - - while (true) { - when (val index = decodeElementIndex(descriptor)) { - 0 -> indexType = decodeSerializableElement(descriptor, 0, PolymorphicSerializer(Type::class)) - 1 -> elemType = decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Type::class)) - CompositeDecoder.DECODE_DONE -> break - else -> error("Unexpected index: $index") - } - } - - ArrayType( - indexType = indexType ?: error("Missing indexType"), - elemType = elemType ?: error("Missing elemType") - ) - } -} \ No newline at end of file diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/serialization/StmtSerializerModule.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/serialization/SerializerModule.kt similarity index 55% rename from subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/serialization/StmtSerializerModule.kt rename to subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/serialization/SerializerModule.kt index a49bdf1313..45ef4a542a 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/serialization/StmtSerializerModule.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/serialization/SerializerModule.kt @@ -16,22 +16,21 @@ package hu.bme.mit.theta.core.serialization -import hu.bme.mit.theta.core.stmt.* +import hu.bme.mit.theta.core.decl.generated.declSerializerModule +import hu.bme.mit.theta.core.stmt.generated.stmtSerializerModule +import hu.bme.mit.theta.core.type.generated.exprSerializerModule +import hu.bme.mit.theta.core.type.generated.typeSerializerModule +import kotlinx.serialization.json.Json import kotlinx.serialization.modules.SerializersModule -import kotlinx.serialization.modules.polymorphic -import kotlinx.serialization.modules.subclass -val stmtSerializerModule = SerializersModule { - polymorphic(Stmt::class) { - subclass(AssignStmt::class) - subclass(AssumeStmt::class) - subclass(HavocStmt::class) - subclass(IfStmt::class) - subclass(LoopStmt::class) - subclass(MemoryAssignStmt::class) - subclass(NonDetStmt::class) - subclass(OrtStmt::class) - subclass(SequenceStmt::class) - subclass(SkipStmt::class) - } -} \ No newline at end of file +val coreSerializerModule = SerializersModule { + include(typeSerializerModule) + include(declSerializerModule) + include(stmtSerializerModule) + include(exprSerializerModule) +} + +val coreJson = Json { + serializersModule = coreSerializerModule + classDiscriminator = "class" +} diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/serialization/Test.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/serialization/Test.kt deleted file mode 100644 index 0e16db3062..0000000000 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/serialization/Test.kt +++ /dev/null @@ -1,128 +0,0 @@ -import kotlinx.serialization.* -import kotlinx.serialization.descriptors.* -import kotlinx.serialization.encoding.* -import kotlinx.serialization.json.Json -import kotlinx.serialization.modules.SerializersModule -import kotlinx.serialization.modules.polymorphic -import kotlinx.serialization.modules.subclass - -@Polymorphic -interface Type - -@Serializable -@SerialName("Bool") -data object BoolType : Type - -@Serializable -@SerialName("Int") -data class IntType(val a: Int) : Type - -@Serializable -@SerialName("String") -data class StringType(val b: Int) : Type - -// Generic ArrayType with custom serializer to avoid circular dependency -@Serializable(with = ArrayTypeSerializer::class) -@SerialName("Array") -data class ArrayType( - val indexType: IndexType, - val elemType: ElemType, -) : Type - -object ArrayTypeSerializer : KSerializer> { - override val descriptor: SerialDescriptor = buildClassSerialDescriptor("Array") { - element("indexType") - element("elemType") - } - - override fun serialize(encoder: Encoder, value: ArrayType) { - encoder.encodeStructure(descriptor) { - // Serialize the actual type objects polymorphically - encodeSerializableElement(descriptor, 0, PolymorphicSerializer(Type::class), value.indexType) - encodeSerializableElement(descriptor, 1, PolymorphicSerializer(Type::class), value.elemType) - } - } - - override fun deserialize(decoder: Decoder): ArrayType { - return decoder.decodeStructure(descriptor) { - var indexType: Type? = null - var elemType: Type? = null - - while (true) { - when (val index = decodeElementIndex(descriptor)) { - 0 -> indexType = decodeSerializableElement(descriptor, 0, PolymorphicSerializer(Type::class)) - 1 -> elemType = decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Type::class)) - CompositeDecoder.DECODE_DONE -> break - else -> error("Unexpected index: $index") - } - } - - ArrayType( - indexType = indexType ?: error("Missing indexType"), - elemType = elemType ?: error("Missing elemType") - ) - } - } -} - -// Configure the serialization module -val typeModule = SerializersModule { - polymorphic(Type::class) { - subclass(BoolType::class) - subclass(IntType::class) - subclass(StringType::class) - subclass(ArrayType::class, ArrayTypeSerializer) - } -} - -val json = Json { - serializersModule = typeModule - classDiscriminator = "type" -} - -// Usage example -fun main() { - val bool: Type = BoolType - val s1 = json.encodeToString(bool) - println("Serialized: $s1") - val d1 = json.decodeFromString(s1) - println("Deserialized: $d1") - - val int: Type = IntType(42) - val s2 = json.encodeToString(int) - println("Serialized: $s2") - val d2 = json.decodeFromString(s2) - println("Deserialized: $d2") - println((d2 as IntType).a) - - // Create a generic array type - val intStringArray = ArrayType( - indexType = IntType(1), - elemType = StringType(2) - ) - - // Serialize using the wrapper approach - val serialized = json.encodeToString(intStringArray) - println("Serialized: $serialized") - - val deserialized = json.decodeFromString(serialized) as ArrayType - println("Deserialized: $deserialized") - println(deserialized.indexType.a) - - - val nestedArray = ArrayType( - indexType = IntType(1), - elemType = ArrayType( - indexType = StringType(2), - elemType = IntType(3) - ) - ) - - // Serialize using the wrapper approach - val serialized2 = json.encodeToString(nestedArray) - println("Serialized: $serialized2") - - val deserialized2 = json.decodeFromString(serialized2) as ArrayType> - println("Deserialized: $deserialized2") - println(deserialized2.elemType.indexType.b) -} \ No newline at end of file diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/serialization/TypeSerializerModule.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/serialization/TypeSerializerModule.kt deleted file mode 100644 index 3a070dfba3..0000000000 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/serialization/TypeSerializerModule.kt +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package hu.bme.mit.theta.core.serialization - -import hu.bme.mit.theta.core.type.Type -import hu.bme.mit.theta.core.type.arraytype.ArrayType -import hu.bme.mit.theta.core.type.booltype.BoolType -import hu.bme.mit.theta.core.type.bvtype.BvType -import hu.bme.mit.theta.core.type.enumtype.EnumType -import hu.bme.mit.theta.core.type.fptype.FpType -import hu.bme.mit.theta.core.type.functype.FuncType -import hu.bme.mit.theta.core.type.inttype.IntType -import hu.bme.mit.theta.core.type.rattype.RatType -import kotlinx.serialization.PolymorphicSerializer -import kotlinx.serialization.modules.SerializersModule -import kotlinx.serialization.modules.polymorphic -import kotlinx.serialization.modules.subclass -import kotlinx.serialization.serializer - -val typeSerializerModule = SerializersModule { - polymorphic(Type::class) { - subclass(BoolType::class) - subclass(IntType::class) - subclass(BvType::class) - subclass(ArrayType::class, ArrayType.Serializer) - subclass(FuncType::class, FuncType.Serializer) - subclass(FpType::class) - subclass(RatType::class) - subclass(EnumType::class) - } -} - -val b = Type::class -val a = typeSerializerModule.serializer() diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/AssignStmt.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/AssignStmt.kt index 6d1a9b25b3..e712f9ab9f 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/AssignStmt.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/AssignStmt.kt @@ -20,8 +20,11 @@ import hu.bme.mit.theta.core.decl.VarDecl import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.Type import hu.bme.mit.theta.core.utils.TypeUtils.cast -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable +import kotlinx.serialization.* +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.descriptors.buildClassSerialDescriptor +import kotlinx.serialization.descriptors.element +import kotlinx.serialization.encoding.* /** * Assignment statement of the form `VARIABLE := EXPRESSION`. The statement updates the VARIABLE @@ -29,7 +32,7 @@ import kotlinx.serialization.Serializable * * @param */ -@Serializable +@Serializable(with = AssignStmt.Serializer::class) @SerialName(AssignStmt.STMT_LABEL) data class AssignStmt(val varDecl: VarDecl, val expr: Expr) : Stmt { @@ -55,4 +58,35 @@ data class AssignStmt(val varDecl: VarDecl, val expr: override fun toString(): String = Utils.lispStringBuilder(STMT_LABEL).add(varDecl.name).add(expr).toString() + + object Serializer : KSerializer> { + override val descriptor: SerialDescriptor = buildClassSerialDescriptor("AssignStmt") { + element>("varDecl") + element>("expr") + } + + override fun serialize(encoder: Encoder, value: AssignStmt) = + encoder.encodeStructure(descriptor) { + encodeSerializableElement(descriptor, 0, VarDecl.Serializer, value.varDecl) + encodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class), value.expr) + } + + override fun deserialize(decoder: Decoder): AssignStmt = + decoder.decodeStructure(descriptor) { + var varDecl: VarDecl? = null + var expr: Expr? = null + while (true) { + when (val i = decodeElementIndex(descriptor)) { + 0 -> varDecl = decodeSerializableElement(descriptor, 0, VarDecl.Serializer) as VarDecl + 1 -> expr = decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class)) as Expr + CompositeDecoder.DECODE_DONE -> break + else -> throw SerializationException("Unknown index $i") + } + } + AssignStmt( + varDecl = varDecl ?: throw SerializationException("Missing varDecl"), + expr = expr ?: throw SerializationException("Missing expr"), + ) + } + } } diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/AssumeStmt.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/AssumeStmt.kt index 7843a9780c..a49162a633 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/AssumeStmt.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/AssumeStmt.kt @@ -20,14 +20,17 @@ import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool import hu.bme.mit.theta.core.type.booltype.BoolType import hu.bme.mit.theta.core.utils.TypeUtils.cast -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable +import kotlinx.serialization.* +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.descriptors.buildClassSerialDescriptor +import kotlinx.serialization.descriptors.element +import kotlinx.serialization.encoding.* /** * Assume statement of the form `[EXPRESSION]`, where EXPRESSION is a Boolean [Expr]. The statement * is a guard that can only be passed if EXPRESSION evaluates to true. */ -@Serializable +@Serializable(with = AssumeStmt.Serializer::class) @SerialName(AssumeStmt.STMT_LABEL) data class AssumeStmt(val cond: Expr) : Stmt { @@ -47,4 +50,28 @@ data class AssumeStmt(val cond: Expr) : Stmt { override fun accept(visitor: StmtVisitor, param: P): R = visitor.visit(this, param) override fun toString(): String = Utils.lispStringBuilder(STMT_LABEL).add(cond).toString() + + object Serializer : KSerializer { + override val descriptor: SerialDescriptor = buildClassSerialDescriptor("AssumeStmt") { + element>("cond") + } + override fun serialize(encoder: Encoder, value: AssumeStmt) = + encoder.encodeStructure(descriptor) { + encodeSerializableElement(descriptor, 0, PolymorphicSerializer(Expr::class), value.cond) + } + override fun deserialize(decoder: Decoder): AssumeStmt = + decoder.decodeStructure(descriptor) { + var cond: Expr? = null + while (true) { + when (val i = decodeElementIndex(descriptor)) { + 0 -> cond = decodeSerializableElement(descriptor, 0, PolymorphicSerializer(Expr::class)) as Expr + CompositeDecoder.DECODE_DONE -> break + else -> throw SerializationException("Unknown index $i") + } + } + AssumeStmt( + cond = cond ?: throw SerializationException("Missing cond") + ) + } + } } diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/HavocStmt.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/HavocStmt.kt index ec1759001d..0577fdfa5f 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/HavocStmt.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/HavocStmt.kt @@ -18,8 +18,10 @@ package hu.bme.mit.theta.core.stmt import hu.bme.mit.theta.common.Utils import hu.bme.mit.theta.core.decl.VarDecl import hu.bme.mit.theta.core.type.Type -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable +import kotlinx.serialization.* +import kotlinx.serialization.descriptors.buildClassSerialDescriptor +import kotlinx.serialization.descriptors.element +import kotlinx.serialization.encoding.* /** * Havoc statement of the form `havoc VARIABLE`, which performs a non-deterministic assignment to @@ -27,7 +29,7 @@ import kotlinx.serialization.Serializable * * @param */ -@Serializable +@Serializable(with = HavocStmt.Serializer::class) @SerialName(HavocStmt.STMT_LABEL) data class HavocStmt(val varDecl: VarDecl) : Stmt { @@ -41,4 +43,28 @@ data class HavocStmt(val varDecl: VarDecl) : Stmt { override fun accept(visitor: StmtVisitor, param: P): R = visitor.visit(this, param) override fun toString(): String = Utils.lispStringBuilder(STMT_LABEL).add(varDecl.name).toString() + + object Serializer : KSerializer> { + override val descriptor = buildClassSerialDescriptor("HavocStmt") { + element>("varDecl") + } + override fun serialize(encoder: Encoder, value: HavocStmt) = + encoder.encodeStructure(descriptor) { + encodeSerializableElement(descriptor, 0, VarDecl.Serializer, value.varDecl) + } + override fun deserialize(decoder: Decoder): HavocStmt = + decoder.decodeStructure(descriptor) { + var varDecl: VarDecl? = null + while (true) { + when (val i = decodeElementIndex(descriptor)) { + 0 -> varDecl = decodeSerializableElement(descriptor, 0, VarDecl.Serializer) + CompositeDecoder.DECODE_DONE -> break + else -> throw SerializationException("Unknown index $i") + } + } + HavocStmt( + varDecl = varDecl ?: throw SerializationException("Missing varDecl"), + ) + } + } } diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/MemoryAssignStmt.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/MemoryAssignStmt.kt index dc0d78deb8..7af06d2c7e 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/MemoryAssignStmt.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/MemoryAssignStmt.kt @@ -19,8 +19,11 @@ import hu.bme.mit.theta.common.Utils import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.Type import hu.bme.mit.theta.core.type.anytype.Dereference -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable +import kotlinx.serialization.* +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.descriptors.buildClassSerialDescriptor +import kotlinx.serialization.descriptors.element +import kotlinx.serialization.encoding.* /** * Assignment statement of the form `*(DEREF_EXPRESSION) := EXPRESSION`. The statement updates the @@ -30,7 +33,7 @@ import kotlinx.serialization.Serializable * @param OffsetType The type of the offset * @param DeclType The type of the value being assigned */ -@Serializable +@Serializable(with = MemoryAssignStmt.Serializer::class) @SerialName(MemoryAssignStmt.STMT_LABEL) data class MemoryAssignStmt( val deref: Dereference, @@ -62,4 +65,33 @@ data class MemoryAssignStmt( override fun toString(): String = Utils.lispStringBuilder(STMT_LABEL).add(deref).add(expr).toString() + + object Serializer : KSerializer> { + override val descriptor: SerialDescriptor = buildClassSerialDescriptor("MemoryAssignStmt") { + element>("deref") + element>("expr") + } + override fun serialize(encoder: Encoder, value: MemoryAssignStmt) = + encoder.encodeStructure(descriptor) { + encodeSerializableElement(descriptor, 0, Dereference.Serializer, value.deref) + encodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class), value.expr) + } + override fun deserialize(decoder: Decoder): MemoryAssignStmt = + decoder.decodeStructure(descriptor) { + var deref: Dereference? = null + var expr: Expr? = null + while (true) { + when (val i = decodeElementIndex(descriptor)) { + 0 -> deref = decodeSerializableElement(descriptor, 0, Dereference.Serializer) as Dereference + 1 -> expr = decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class)) as Expr + CompositeDecoder.DECODE_DONE -> break + else -> throw SerializationException("Unknown index $i") + } + } + MemoryAssignStmt( + deref ?: throw SerializationException("Missing deref "), + expr ?: throw SerializationException("Missing expr ") + ) + } + } } diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/Dereference.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/Dereference.kt index 97d698baa4..35347ded5b 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/Dereference.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/Dereference.kt @@ -21,8 +21,12 @@ import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.LitExpr import hu.bme.mit.theta.core.type.Type import hu.bme.mit.theta.core.type.inttype.IntType -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable +import kotlinx.serialization.* +import kotlinx.serialization.builtins.nullable +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.descriptors.buildClassSerialDescriptor +import kotlinx.serialization.descriptors.element +import kotlinx.serialization.encoding.* /** * Represents a dereference expression for array access. @@ -35,7 +39,7 @@ import kotlinx.serialization.Serializable * @property type The type of the dereferenced element * @property uniquenessIdx Optional uniqueness index for SMT encoding */ -@Serializable +@Serializable(with = Dereference.Serializer::class) @SerialName("Dereference") data class Dereference( val array: Expr, @@ -85,4 +89,48 @@ data class Dereference( override fun toString(): String = Utils.lispStringBuilder(OPERATOR_LABEL).body().addAll(ops).add(type).toString() + + object Serializer : KSerializer> { + + override val descriptor: SerialDescriptor = buildClassSerialDescriptor("Dereference") { + element>("array") + element>("offset") + element("type") + element?>("uniquenessIdx") + } + + override fun serialize(encoder: Encoder, value: Dereference) = + encoder.encodeStructure(descriptor) { + encodeSerializableElement(descriptor, 0, PolymorphicSerializer(Expr::class), value.array) + encodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class), value.offset) + encodeSerializableElement(descriptor, 2, PolymorphicSerializer(Type::class), value.type) + encodeSerializableElement(descriptor, 3, PolymorphicSerializer(Expr::class).nullable, value.uniquenessIdx) + } + + override fun deserialize(decoder: Decoder): Dereference = + decoder.decodeStructure(descriptor) { + var array: Expr? = null + var offset: Expr? = null + var type: Type? = null + var uniquenessIdx: Expr? = null + while (true) { + when (val i = decodeElementIndex(descriptor)) { + 0 -> array = decodeSerializableElement(descriptor, 0, PolymorphicSerializer(Expr::class)) + 1 -> offset = decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class)) + 2 -> type = decodeSerializableElement(descriptor, 2, PolymorphicSerializer(Type::class)) + 3 -> uniquenessIdx = + decodeSerializableElement(descriptor, 3, PolymorphicSerializer(Expr::class).nullable) as Expr? + + CompositeDecoder.DECODE_DONE -> break + else -> throw SerializationException("Unknown index $i") + } + } + Dereference( + array ?: throw SerializationException("Missing array "), + offset ?: throw SerializationException("Missing offset "), + type ?: throw SerializationException("Missing type "), + uniquenessIdx + ) + } + } } diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/InvalidLitExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/InvalidLitExpr.kt index 94aa7f5141..1836fbaf14 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/InvalidLitExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/InvalidLitExpr.kt @@ -19,15 +19,17 @@ import hu.bme.mit.theta.core.model.Valuation import hu.bme.mit.theta.core.type.LitExpr import hu.bme.mit.theta.core.type.NullaryExpr import hu.bme.mit.theta.core.type.Type -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable +import kotlinx.serialization.* +import kotlinx.serialization.descriptors.buildClassSerialDescriptor +import kotlinx.serialization.descriptors.element +import kotlinx.serialization.encoding.* /** * Represents an invalid literal expression. * * @param ExprType The type of the expression */ -@Serializable +@Serializable(with = InvalidLitExpr.Serializer::class) @SerialName("InvalidLit") data class InvalidLitExpr(override val type: ExprType) : NullaryExpr(), LitExpr { @@ -37,4 +39,28 @@ data class InvalidLitExpr(override val type: ExprType) : override val isInvalid: Boolean = true override fun equals(other: Any?): Boolean = false + + object Serializer : KSerializer> { + override val descriptor = buildClassSerialDescriptor("InvalidLit") { + element("type") + } + override fun serialize(encoder: Encoder, value: InvalidLitExpr) = + encoder.encodeStructure(descriptor) { + encodeSerializableElement(descriptor, 0, PolymorphicSerializer(Type::class), value.type) + } + override fun deserialize(decoder: Decoder): InvalidLitExpr = + decoder.decodeStructure(descriptor) { + var type: Type? = null + while (true) { + when (val i = decodeElementIndex(descriptor)) { + 0 -> type = decodeSerializableElement(descriptor, 0, PolymorphicSerializer(Type::class)) + CompositeDecoder.DECODE_DONE -> break + else -> throw SerializationException("Unknown index $i") + } + } + InvalidLitExpr( + type = type ?: throw SerializationException("Missing type ") + ) + } + } } diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/IteExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/IteExpr.kt index bbc8e1e950..baa5cbb9b1 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/IteExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/IteExpr.kt @@ -24,15 +24,18 @@ import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool import hu.bme.mit.theta.core.type.booltype.BoolLitExpr import hu.bme.mit.theta.core.type.booltype.BoolType import hu.bme.mit.theta.core.utils.TypeUtils.cast -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable +import kotlinx.serialization.* +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.descriptors.buildClassSerialDescriptor +import kotlinx.serialization.descriptors.element +import kotlinx.serialization.encoding.* /** * Represents an if-then-else expression. * * @param ExprType The type of the expression */ -@Serializable +@Serializable(with = IteExpr.Serializer::class) @SerialName("Ite") data class IteExpr( val cond: Expr, @@ -99,4 +102,38 @@ data class IteExpr( override fun toString(): String = Utils.lispStringBuilder(OPERATOR_LABEL).add(cond).add(then).add(elze).toString() + + object Serializer : KSerializer> { + override val descriptor: SerialDescriptor = buildClassSerialDescriptor("Ite") { + element>("cond") + element>("then") + element>("elze") + } + override fun serialize(encoder: Encoder, value: IteExpr) = + encoder.encodeStructure(descriptor) { + encodeSerializableElement(descriptor, 0, PolymorphicSerializer(Expr::class), value.cond) + encodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class), value.then) + encodeSerializableElement(descriptor, 2, PolymorphicSerializer(Expr::class), value.elze) + } + override fun deserialize(decoder: Decoder): IteExpr = + decoder.decodeStructure(descriptor) { + var cond: Expr? = null + var then: Expr? = null + var elze: Expr? = null + while (true) { + when (val i = decodeElementIndex(descriptor)) { + 0 -> cond = decodeSerializableElement(descriptor, 0, PolymorphicSerializer(Expr::class)) as Expr + 1 -> then = decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class)) as Expr + 2 -> elze = decodeSerializableElement(descriptor, 2, PolymorphicSerializer(Expr::class)) as Expr + CompositeDecoder.DECODE_DONE -> break + else -> throw SerializationException("Unknown index $i") + } + } + IteExpr( + cond ?: throw SerializationException("Missing cond "), + then ?: throw SerializationException("Missing then "), + elze ?: throw SerializationException("Missing elze ") + ) + } + } } diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/PrimeExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/PrimeExpr.kt index 7d196ef9f7..f353bbedd1 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/PrimeExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/PrimeExpr.kt @@ -20,15 +20,18 @@ import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.LitExpr import hu.bme.mit.theta.core.type.Type import hu.bme.mit.theta.core.type.UnaryExpr -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable +import kotlinx.serialization.* +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.descriptors.buildClassSerialDescriptor +import kotlinx.serialization.descriptors.element +import kotlinx.serialization.encoding.* /** * Represents a prime expression (next state). * * @param ExprType The type of the expression */ -@Serializable +@Serializable(with = PrimeExpr.Serializer::class) @SerialName("Prime") data class PrimeExpr(override val op: Expr) : UnaryExpr() { @@ -49,4 +52,28 @@ data class PrimeExpr(override val op: Expr) : override fun new(op: Expr): PrimeExpr = of(op) override val operatorLabel: String = OPERATOR_LABEL + + object Serializer : KSerializer> { + override val descriptor: SerialDescriptor = buildClassSerialDescriptor("Prime") { + element>("op") + } + override fun serialize(encoder: Encoder, value: PrimeExpr) = + encoder.encodeStructure(descriptor) { + encodeSerializableElement(descriptor, 0, PolymorphicSerializer(Expr::class), value.op) + } + override fun deserialize(decoder: Decoder): PrimeExpr = + decoder.decodeStructure(descriptor) { + var op: Expr? = null + while (true) { + when (val i = decodeElementIndex(descriptor)) { + 0 -> op = decodeSerializableElement(descriptor, 0, PolymorphicSerializer(Expr::class)) + CompositeDecoder.DECODE_DONE -> break + else -> throw SerializationException("Unknown index $i") + } + } + PrimeExpr( + op = op ?: throw SerializationException("Missing op ") + ) + } + } } diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/RefExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/RefExpr.kt index 93e6b6645d..9854eeeea7 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/RefExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/RefExpr.kt @@ -20,15 +20,18 @@ import hu.bme.mit.theta.core.model.Valuation import hu.bme.mit.theta.core.type.LitExpr import hu.bme.mit.theta.core.type.NullaryExpr import hu.bme.mit.theta.core.type.Type -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable +import kotlinx.serialization.* +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.descriptors.buildClassSerialDescriptor +import kotlinx.serialization.descriptors.element +import kotlinx.serialization.encoding.* /** * Represents a reference to a declaration. * * @param DeclType The type of the declaration */ -@Serializable +@Serializable(with = RefExpr.Serializer::class) @SerialName("Ref") data class RefExpr(val decl: Decl) : NullaryExpr() { @@ -45,4 +48,28 @@ data class RefExpr(val decl: Decl) : NullaryExpr> { + override val descriptor: SerialDescriptor = buildClassSerialDescriptor("Ref") { + element>("decl") + } + override fun serialize(encoder: Encoder, value: RefExpr) = + encoder.encodeStructure(descriptor) { + encodeSerializableElement(descriptor, 0, PolymorphicSerializer(Decl::class), value.decl) + } + override fun deserialize(decoder: Decoder): RefExpr = + decoder.decodeStructure(descriptor) { + var decl: Decl? = null + while (true) { + when (val i = decodeElementIndex(descriptor)) { + 0 -> decl = decodeSerializableElement(descriptor, 0, PolymorphicSerializer(Decl::class)) + CompositeDecoder.DECODE_DONE -> break + else -> throw SerializationException("Unknown index $i") + } + } + RefExpr( + decl = decl ?: throw SerializationException("Missing decl ") + ) + } + } } diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/Reference.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/Reference.kt index ae1c1abef3..ae50c1a211 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/Reference.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/Reference.kt @@ -15,14 +15,16 @@ */ package hu.bme.mit.theta.core.type.anytype -import hu.bme.mit.theta.common.Utils import hu.bme.mit.theta.core.decl.VarDecl import hu.bme.mit.theta.core.model.Valuation import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.LitExpr import hu.bme.mit.theta.core.type.Type -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable +import kotlinx.serialization.* +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.descriptors.buildClassSerialDescriptor +import kotlinx.serialization.descriptors.element +import kotlinx.serialization.encoding.* /** * Represents a reference to an expression. @@ -32,12 +34,11 @@ import kotlinx.serialization.Serializable * @property expr The referenced expression * @property type The type of the reference */ -@Serializable +@Serializable(with = Reference.Serializer::class) @SerialName("Reference") data class Reference(val expr: Expr, override val type: A) : Expr { companion object { - private const val OPERATOR_LABEL = "ref" @JvmStatic fun of(expr: Expr, type: A): Reference = Reference(expr, type) @@ -58,6 +59,32 @@ data class Reference(val expr: Expr, override val type: A @Suppress("UNCHECKED_CAST") return Reference(ops[0] as Expr, type) } - override fun toString(): String = - Utils.lispStringBuilder(OPERATOR_LABEL).body().add(expr).add(type).toString() + object Serializer : KSerializer> { + override val descriptor: SerialDescriptor = buildClassSerialDescriptor("Reference") { + element>("expr") + element("type") + } + override fun serialize(encoder: Encoder, value: Reference) = + encoder.encodeStructure(descriptor) { + encodeSerializableElement(descriptor, 0, PolymorphicSerializer(Expr::class), value.expr) + encodeSerializableElement(descriptor, 1, PolymorphicSerializer(Type::class), value.type) + } + override fun deserialize(decoder: Decoder): Reference = + decoder.decodeStructure(descriptor) { + var expr: Expr? = null + var type: Type? = null + while (true) { + when (val i = decodeElementIndex(descriptor)) { + 0 -> expr = decodeSerializableElement(descriptor, 0, PolymorphicSerializer(Expr::class)) + 1 -> type = decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Type::class)) + CompositeDecoder.DECODE_DONE -> break + else -> throw SerializationException("Unknown index $i") + } + } + Reference( + expr ?: throw SerializationException("Missing expr "), + type ?: throw SerializationException("Missing type ") + ) + } + } } diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayEqExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayEqExpr.kt index 203d5f8657..859a5b87d6 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayEqExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayEqExpr.kt @@ -22,12 +22,15 @@ import hu.bme.mit.theta.core.type.Type import hu.bme.mit.theta.core.type.abstracttype.EqExpr import hu.bme.mit.theta.core.type.booltype.BoolType import hu.bme.mit.theta.core.utils.TypeUtils.cast -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable +import kotlinx.serialization.* +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.descriptors.buildClassSerialDescriptor +import kotlinx.serialization.descriptors.element +import kotlinx.serialization.encoding.* /** Equality expression for array types. */ -@Serializable -@SerialName("ArrayEqExpr") +@Serializable(with = ArrayEqExpr.Serializer::class) +@SerialName("ArrayEq") data class ArrayEqExpr( override val leftOp: Expr>, override val rightOp: Expr>, @@ -61,4 +64,33 @@ data class ArrayEqExpr( ): ArrayEqExpr = of(leftOp, rightOp) override fun toString(): String = super.toString() + + object Serializer : KSerializer> { + override val descriptor: SerialDescriptor = buildClassSerialDescriptor("ArrayEq") { + element>("leftOp") + element>("rightOp") + } + override fun serialize(encoder: Encoder, value: ArrayEqExpr) = + encoder.encodeStructure(descriptor) { + encodeSerializableElement(descriptor, 0, PolymorphicSerializer(Expr::class), value.leftOp) + encodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class), value.rightOp) + } + override fun deserialize(decoder: Decoder): ArrayEqExpr = + decoder.decodeStructure(descriptor) { + var leftOp: Expr>? = null + var rightOp: Expr>? = null + while (true) { + when (val i = decodeElementIndex(descriptor)) { + 0 -> leftOp = decodeSerializableElement(descriptor, 0, PolymorphicSerializer(Expr::class)) as Expr> + 1 -> rightOp = decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class)) as Expr> + CompositeDecoder.DECODE_DONE -> break + else -> throw SerializationException("Unknown index $i") + } + } + ArrayEqExpr( + leftOp ?: throw SerializationException("Missing leftOp "), + rightOp ?: throw SerializationException("Missing rightOp ") + ) + } + } } diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayInitExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayInitExpr.kt index 62ead64fb7..74609166bf 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayInitExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayInitExpr.kt @@ -20,8 +20,13 @@ import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.LitExpr import hu.bme.mit.theta.core.type.MultiaryExpr import hu.bme.mit.theta.core.type.Type -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable +import kotlinx.serialization.* +import kotlinx.serialization.builtins.ListSerializer +import kotlinx.serialization.builtins.PairSerializer +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.descriptors.buildClassSerialDescriptor +import kotlinx.serialization.descriptors.element +import kotlinx.serialization.encoding.* /** * ArrayInitExpr is a way to specify arbitrary array 'literals' that may contain non-literal @@ -31,7 +36,7 @@ import kotlinx.serialization.Serializable * `elseElem` are mapped to `ops` by first placing the `elseElem`, then all indices, then all * elements. */ -@Serializable +@Serializable(with = ArrayInitExpr.Serializer::class) @SerialName("ArrayInit") data class ArrayInitExpr( val elements: List, Expr>>, @@ -105,4 +110,38 @@ data class ArrayInitExpr( override val operatorLabel: String = OPERATOR_LABEL override fun toString(): String = "arrayinit($elements, $elseElem, $type)" + + object Serializer : KSerializer> { + override val descriptor: SerialDescriptor = buildClassSerialDescriptor("ArrayInit") { + element, Expr>>>("elements") + element>("elseElem") + element>("type") + } + override fun serialize(encoder: Encoder, value: ArrayInitExpr) = + encoder.encodeStructure(descriptor) { + encodeSerializableElement(descriptor, 0, ListSerializer(PairSerializer(PolymorphicSerializer(Expr::class), PolymorphicSerializer(Expr::class))), value.elements) + encodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class), value.elseElem) + encodeSerializableElement(descriptor, 2, PolymorphicSerializer(ArrayType::class), value.type) + } + override fun deserialize(decoder: Decoder): ArrayInitExpr = + decoder.decodeStructure(descriptor) { + var elements: List, Expr>>? = null + var elseElem: Expr? = null + var type: ArrayType? = null + while (true) { + when (val i = decodeElementIndex(descriptor)) { + 0 -> elements = decodeSerializableElement(descriptor, 0, ListSerializer(PairSerializer(PolymorphicSerializer(Expr::class), PolymorphicSerializer(Expr::class)))) as List, Expr>> + 1 -> elseElem = decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class)) as Expr + 2 -> type = decodeSerializableElement(descriptor, 2, PolymorphicSerializer(ArrayType::class)) as ArrayType + CompositeDecoder.DECODE_DONE -> break + else -> throw SerializationException("Unknown index $i") + } + } + ArrayInitExpr( + elements ?: throw SerializationException("Missing elements"), + elseElem ?: throw SerializationException("Missing elseElem"), + type ?: throw SerializationException("Missing type") + ) + } + } } diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayLitExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayLitExpr.kt index 9a5d2c5121..7446b546ed 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayLitExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayLitExpr.kt @@ -22,9 +22,11 @@ import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.LitExpr import hu.bme.mit.theta.core.type.NullaryExpr import hu.bme.mit.theta.core.type.Type -import hu.bme.mit.theta.core.type.generated.typeSerializerModule import hu.bme.mit.theta.core.utils.ExprSimplifier -import kotlinx.serialization.* +import kotlinx.serialization.KSerializer +import kotlinx.serialization.PolymorphicSerializer +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable import kotlinx.serialization.builtins.ListSerializer import kotlinx.serialization.builtins.PairSerializer import kotlinx.serialization.descriptors.SerialDescriptor @@ -33,7 +35,7 @@ import kotlinx.serialization.descriptors.element import kotlinx.serialization.encoding.* /** Literal array expression for array types, containing only literal values. */ -@Serializable +@Serializable(with = ArrayLitExpr.Serializer::class) @SerialName("ArrayLit") data class ArrayLitExpr( val elements: List, LitExpr>>, @@ -78,7 +80,7 @@ data class ArrayLitExpr( .toString() object Serializer : KSerializer> { - override val descriptor: SerialDescriptor = buildClassSerialDescriptor("ArrayLitExpr") { + override val descriptor: SerialDescriptor = buildClassSerialDescriptor("ArrayLit") { element("elements") element("elseElem") element("type") diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayNeqExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayNeqExpr.kt index 31d15e9601..2baebed5b1 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayNeqExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayNeqExpr.kt @@ -22,12 +22,15 @@ import hu.bme.mit.theta.core.type.Type import hu.bme.mit.theta.core.type.abstracttype.NeqExpr import hu.bme.mit.theta.core.type.booltype.BoolType import hu.bme.mit.theta.core.utils.TypeUtils.cast -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable +import kotlinx.serialization.* +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.descriptors.buildClassSerialDescriptor +import kotlinx.serialization.descriptors.element +import kotlinx.serialization.encoding.* /** Not-equal expression for array types. */ -@Serializable -@SerialName("ArrayNeqExpr") +@Serializable(with = ArrayNeqExpr.Serializer::class) +@SerialName("ArrayNeq") data class ArrayNeqExpr( override val leftOp: Expr>, override val rightOp: Expr>, @@ -60,4 +63,33 @@ data class ArrayNeqExpr( ): ArrayNeqExpr = of(leftOp, rightOp) override fun toString(): String = super.toString() + + object Serializer : KSerializer> { + override val descriptor: SerialDescriptor = buildClassSerialDescriptor("ArrayNeq") { + element>("leftOp") + element>("rightOp") + } + override fun serialize(encoder: Encoder, value: ArrayNeqExpr) = + encoder.encodeStructure(descriptor) { + encodeSerializableElement(descriptor, 0, PolymorphicSerializer(Expr::class), value.leftOp) + encodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class), value.rightOp) + } + override fun deserialize(decoder: Decoder): ArrayNeqExpr = + decoder.decodeStructure(descriptor) { + var leftOp: Expr>? = null + var rightOp: Expr>? = null + while (true) { + when (val i = decodeElementIndex(descriptor)) { + 0 -> leftOp = decodeSerializableElement(descriptor, 0, PolymorphicSerializer(Expr::class)) as Expr> + 1 -> rightOp = decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class)) as Expr> + CompositeDecoder.DECODE_DONE -> break + else -> throw SerializationException("Unknown index $i") + } + } + ArrayNeqExpr( + leftOp ?: throw SerializationException("Missing leftOp"), + rightOp ?: throw SerializationException("Missing rightOp") + ) + } + } } diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayReadExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayReadExpr.kt index bbd784799b..2af5d06656 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayReadExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayReadExpr.kt @@ -21,12 +21,15 @@ import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.LitExpr import hu.bme.mit.theta.core.type.Type import hu.bme.mit.theta.core.utils.TypeUtils.cast -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable +import kotlinx.serialization.* +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.descriptors.buildClassSerialDescriptor +import kotlinx.serialization.descriptors.element +import kotlinx.serialization.encoding.* /** Read expression for array types. */ -@Serializable -@SerialName("ArrayReadExpr") +@Serializable(with = ArrayReadExpr.Serializer::class) +@SerialName("ArrayRead") data class ArrayReadExpr( val array: Expr>, val index: Expr, @@ -91,4 +94,33 @@ data class ArrayReadExpr( override fun toString(): String = Utils.lispStringBuilder(OPERATOR_LABEL).body().add(array).add(index).toString() + + object Serializer : KSerializer> { + override val descriptor: SerialDescriptor = buildClassSerialDescriptor("ArrayRead") { + element>("array") + element>("index") + } + override fun serialize(encoder: Encoder, value: ArrayReadExpr) = + encoder.encodeStructure(descriptor) { + encodeSerializableElement(descriptor, 0, PolymorphicSerializer(Expr::class), value.array) + encodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class), value.index) + } + override fun deserialize(decoder: Decoder): ArrayReadExpr = + decoder.decodeStructure(descriptor) { + var array: Expr>? = null + var index: Expr? = null + while (true) { + when (val i = decodeElementIndex(descriptor)) { + 0 -> array = decodeSerializableElement(descriptor, 0, PolymorphicSerializer(Expr::class)) as Expr> + 1 -> index = decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class)) as Expr + CompositeDecoder.DECODE_DONE -> break + else -> throw SerializationException("Unknown index $i") + } + } + ArrayReadExpr( + array ?: throw SerializationException("Missing array"), + index ?: throw SerializationException("Missing index") + ) + } + } } diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayWriteExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayWriteExpr.kt index b0d0bae61d..06846af5d9 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayWriteExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayWriteExpr.kt @@ -21,12 +21,15 @@ import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.LitExpr import hu.bme.mit.theta.core.type.Type import hu.bme.mit.theta.core.utils.TypeUtils.cast -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable +import kotlinx.serialization.* +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.descriptors.buildClassSerialDescriptor +import kotlinx.serialization.descriptors.element +import kotlinx.serialization.encoding.* /** Write expression for array types. */ -@Serializable -@SerialName("ArrayWriteExpr") +@Serializable(with = ArrayWriteExpr.Serializer::class) +@SerialName("ArrayWrite") data class ArrayWriteExpr( val array: Expr>, val index: Expr, @@ -97,4 +100,38 @@ data class ArrayWriteExpr( with(array, index, elem) fun withElem(elem: Expr): ArrayWriteExpr = with(array, index, elem) + + object Serializer : KSerializer> { + override val descriptor: SerialDescriptor = buildClassSerialDescriptor("ArrayWrite") { + element>("array") + element>("index") + element>("elem") + } + override fun serialize(encoder: Encoder, value: ArrayWriteExpr) = + encoder.encodeStructure(descriptor) { + encodeSerializableElement(descriptor, 0, PolymorphicSerializer(Expr::class), value.array) + encodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class), value.index) + encodeSerializableElement(descriptor, 2, PolymorphicSerializer(Expr::class), value.elem) + } + override fun deserialize(decoder: Decoder): ArrayWriteExpr = + decoder.decodeStructure(descriptor) { + var array: Expr>? = null + var index: Expr? = null + var elem: Expr? = null + while (true) { + when (val i = decodeElementIndex(descriptor)) { + 0 -> array = decodeSerializableElement(descriptor, 0, PolymorphicSerializer(Expr::class)) as Expr> + 1 -> index = decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class)) as Expr + 2 -> elem = decodeSerializableElement(descriptor, 2, PolymorphicSerializer(Expr::class)) as Expr + CompositeDecoder.DECODE_DONE -> break + else -> throw SerializationException("Unknown index $i") + } + } + ArrayWriteExpr( + array ?: throw SerializationException("Missing array"), + index ?: throw SerializationException("Missing index"), + elem ?: throw SerializationException("Missing elem") + ) + } + } } diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/enumtype/EnumEqExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/enumtype/EnumEqExpr.kt index 3a19225f0c..ad296756c6 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/enumtype/EnumEqExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/enumtype/EnumEqExpr.kt @@ -24,7 +24,7 @@ import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable -@SerialName("EnumEqExpr") +@SerialName("EnumEq") data class EnumEqExpr(override val leftOp: Expr, override val rightOp: Expr) : EqExpr() { diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/enumtype/EnumLitExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/enumtype/EnumLitExpr.kt index f7573aca1c..4568d7bfd8 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/enumtype/EnumLitExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/enumtype/EnumLitExpr.kt @@ -24,7 +24,7 @@ import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable -@SerialName("EnumLitExpr") +@SerialName("EnumLit") data class EnumLitExpr(override val type: EnumType, val value: String) : NullaryExpr(), LitExpr { diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/enumtype/EnumNeqExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/enumtype/EnumNeqExpr.kt index d974b27414..8dab066929 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/enumtype/EnumNeqExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/enumtype/EnumNeqExpr.kt @@ -24,7 +24,7 @@ import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @Serializable -@SerialName("EnumNeqExpr") +@SerialName("EnumNeq") data class EnumNeqExpr(override val leftOp: Expr, override val rightOp: Expr) : NeqExpr() { diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/functype/FuncAppExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/functype/FuncAppExpr.kt index c69d93001c..93b3c6ba66 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/functype/FuncAppExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/functype/FuncAppExpr.kt @@ -21,12 +21,15 @@ import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.LitExpr import hu.bme.mit.theta.core.type.Type import hu.bme.mit.theta.core.utils.TypeUtils.cast -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable +import kotlinx.serialization.* +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.descriptors.buildClassSerialDescriptor +import kotlinx.serialization.descriptors.element +import kotlinx.serialization.encoding.* /** Function application expression for function types. */ -@Serializable -@SerialName("FuncAppExpr") +@Serializable(with = FuncAppExpr.Serializer::class) +@SerialName("FuncApp") data class FuncAppExpr( val func: Expr>, val param: Expr, @@ -76,4 +79,33 @@ data class FuncAppExpr( fun withParam(param: Expr): FuncAppExpr = with(func, param) override fun toString(): String = Utils.lispStringBuilder().add(func).body().add(param).toString() + + object Serializer : KSerializer> { + override val descriptor: SerialDescriptor = buildClassSerialDescriptor("FuncApp") { + element>("func") + element>("param") + } + override fun serialize(encoder: Encoder, value: FuncAppExpr) = + encoder.encodeStructure(descriptor) { + encodeSerializableElement(descriptor, 0, PolymorphicSerializer(Expr::class), value.func) + encodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class), value.param) + } + override fun deserialize(decoder: Decoder): FuncAppExpr = + decoder.decodeStructure(descriptor) { + var func: Expr>? = null + var param: Expr? = null + while (true) { + when (val i = decodeElementIndex(descriptor)) { + 0 -> func = decodeSerializableElement(descriptor, 0, PolymorphicSerializer(Expr::class)) as Expr> + 1 -> param = decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class)) as Expr + CompositeDecoder.DECODE_DONE -> break + else -> throw SerializationException("Unknown index $i") + } + } + FuncAppExpr( + func ?: throw SerializationException("Missing func"), + param ?: throw SerializationException("Missing param") + ) + } + } } diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/functype/FuncLitExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/functype/FuncLitExpr.kt index f02a3eb92f..033d1f6713 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/functype/FuncLitExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/functype/FuncLitExpr.kt @@ -22,12 +22,15 @@ import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.LitExpr import hu.bme.mit.theta.core.type.Type import hu.bme.mit.theta.core.utils.TypeUtils.cast -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable +import kotlinx.serialization.* +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.descriptors.buildClassSerialDescriptor +import kotlinx.serialization.descriptors.element +import kotlinx.serialization.encoding.* /** Function literal expression (lambda abstraction) for function types. */ -@Serializable -@SerialName("FuncLitExpr") +@Serializable(with = FuncLitExpr.Serializer::class) +@SerialName("FuncLit") data class FuncLitExpr( val param: ParamDecl, val result: Expr, @@ -62,4 +65,33 @@ data class FuncLitExpr( val paramString = "(${param.name} ${param.type})" return Utils.lispStringBuilder(OPERATOR_LABEL).body().add(paramString).add(result).toString() } + + object Serializer : KSerializer> { + override val descriptor: SerialDescriptor = buildClassSerialDescriptor("FuncLit") { + element>("param") + element>("result") + } + override fun serialize(encoder: Encoder, value: FuncLitExpr) = + encoder.encodeStructure(descriptor) { + encodeSerializableElement(descriptor, 0, PolymorphicSerializer(ParamDecl::class), value.param) + encodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class), value.result) + } + override fun deserialize(decoder: Decoder): FuncLitExpr = + decoder.decodeStructure(descriptor) { + var param: ParamDecl? = null + var result: Expr? = null + while (true) { + when (val i = decodeElementIndex(descriptor)) { + 0 -> param = decodeSerializableElement(descriptor, 0, PolymorphicSerializer(ParamDecl::class)) + 1 -> result = decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class)) + CompositeDecoder.DECODE_DONE -> break + else -> throw SerializationException("Unknown index $i") + } + } + FuncLitExpr( + param ?: throw SerializationException("Missing param"), + result ?: throw SerializationException("Missing result") + ) + } + } } diff --git a/subprojects/common/core/src/test/kotlin/hu/bme/mit/theta/core/serialization/StmtSerializationTest.kt b/subprojects/common/core/src/test/kotlin/hu/bme/mit/theta/core/serialization/StmtSerializationTest.kt index 00e475bf0e..a628f75192 100644 --- a/subprojects/common/core/src/test/kotlin/hu/bme/mit/theta/core/serialization/StmtSerializationTest.kt +++ b/subprojects/common/core/src/test/kotlin/hu/bme/mit/theta/core/serialization/StmtSerializationTest.kt @@ -18,20 +18,18 @@ package hu.bme.mit.theta.core.serialization import hu.bme.mit.theta.core.decl.Decls import hu.bme.mit.theta.core.stmt.* -//import hu.bme.mit.theta.core.stmt.generated.stmtSerializer import hu.bme.mit.theta.core.type.anytype.Dereference import hu.bme.mit.theta.core.type.inttype.IntExprs.Eq import hu.bme.mit.theta.core.type.inttype.IntExprs.Int import kotlinx.serialization.encodeToString -import kotlinx.serialization.json.Json import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Test class StmtSerializationTest { - private val json = Json { -// serializersModule = stmtSerializer - classDiscriminator = "type" + companion object { + + private val json = coreJson } @Test diff --git a/subprojects/common/core/src/test/kotlin/hu/bme/mit/theta/core/serialization/TypeSerializationTest.kt b/subprojects/common/core/src/test/kotlin/hu/bme/mit/theta/core/serialization/TypeSerializationTest.kt index 3a66e5e0e4..ff183eec02 100644 --- a/subprojects/common/core/src/test/kotlin/hu/bme/mit/theta/core/serialization/TypeSerializationTest.kt +++ b/subprojects/common/core/src/test/kotlin/hu/bme/mit/theta/core/serialization/TypeSerializationTest.kt @@ -1,3 +1,19 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package hu.bme.mit.theta.core.serialization import hu.bme.mit.theta.core.type.Type @@ -24,10 +40,7 @@ class TypeSerializationTest { companion object { - private val json = Json { - serializersModule = typeSerializerModule - classDiscriminator = "type" - } + private val json = coreJson @JvmStatic val bvTypeTestData: List = listOf( @@ -150,8 +163,8 @@ class TypeSerializationTest { } val jsonIgnoreUnknownKey = Json { - serializersModule = typeSerializerModule - classDiscriminator = "type" + serializersModule = coreSerializerModule + classDiscriminator = "class" ignoreUnknownKeys = true } assertDoesNotThrow { diff --git a/subprojects/common/ksp-processor/src/main/kotlin/hu/bme/mit/theta/ksp/PolymorphicModuleProcessor.kt b/subprojects/common/ksp-processor/src/main/kotlin/hu/bme/mit/theta/ksp/PolymorphicModuleProcessor.kt index cd3c209b06..7236f84803 100644 --- a/subprojects/common/ksp-processor/src/main/kotlin/hu/bme/mit/theta/ksp/PolymorphicModuleProcessor.kt +++ b/subprojects/common/ksp-processor/src/main/kotlin/hu/bme/mit/theta/ksp/PolymorphicModuleProcessor.kt @@ -9,17 +9,17 @@ class PolymorphicModuleProcessor( private val codeGenerator: CodeGenerator, private val logger: KSPLogger, private val pack: String, - private val topLevelClass: String, + private val baseClass: String, ) : SymbolProcessor { override fun process(resolver: Resolver): List { - val topLevelClassFqn = "$pack.$topLevelClass" + val topLevelClassFqn = "$pack.$baseClass" val generatedPack = "$pack.generated" val subclasses = resolver .getSymbolsWithAnnotation("kotlinx.serialization.Serializable") .filterIsInstance() - .filter { !it.isAbstract() } + .filter { !it.isAbstract() && it.getSealedSubclasses().toList().isEmpty() } .filter { val allSuperTypes = it.getAllSuperTypes() allSuperTypes.any { superType -> @@ -33,17 +33,11 @@ class PolymorphicModuleProcessor( val file = codeGenerator.createNewFile( Dependencies(false), generatedPack, - "${topLevelClass}Serializer" + "${baseClass}Serializer" ) file.bufferedWriter().use { writer -> writer.write("package $generatedPack\n\n") - writer.write("import kotlinx.serialization.KSerializer\n") - writer.write("import kotlinx.serialization.PolymorphicSerializer\n") - writer.write("import kotlinx.serialization.descriptors.SerialDescriptor\n") - writer.write("import kotlinx.serialization.descriptors.buildClassSerialDescriptor\n") - writer.write("import kotlinx.serialization.descriptors.element\n") - writer.write("import kotlinx.serialization.encoding.*\n") writer.write("import kotlinx.serialization.modules.SerializersModule\n") writer.write("import kotlinx.serialization.modules.polymorphic\n") writer.write("import kotlinx.serialization.modules.subclass\n") @@ -54,9 +48,9 @@ class PolymorphicModuleProcessor( } writer.write( - "\nval ${topLevelClass.replaceFirstChar { it.lowercase() }}SerializerModule = SerializersModule {\n" + "\nval ${baseClass.replaceFirstChar { it.lowercase() }}SerializerModule = SerializersModule {\n" ) - writer.write(" polymorphic($topLevelClass::class) {\n") + writer.write(" polymorphic($baseClass::class) {\n") subclasses.forEach { subclass -> val serializer = subclass.annotations.firstOrNull { @@ -76,69 +70,6 @@ class PolymorphicModuleProcessor( } writer.write(" }\n") writer.write("}\n") - - subclasses.filter { it.typeParameters.isNotEmpty() }.forEach { subclass -> - val name = subclass.simpleName.asString() - logger.warn("$name -> ${subclass.typeParameters[0].bounds.toList()}") - val typeParams = subclass.typeParameters.joinToString(", ") { - val bounds = it.bounds.toList() - require(bounds.size <= 1) { - "Serializer class generation: multiple bounds not supported for type parameters." - } - "out ${bounds.firstOrNull()?.toString() ?: "Any?"}" - } - - writer.write("\n\nclass ${name}Serializer : KSerializer<$name<$typeParams>> {\n\n") - writer.write( - " override val descriptor: SerialDescriptor = buildClassSerialDescriptor(\"$name\") {\n" - ) - - val parameters = subclass.primaryConstructor!!.parameters.map { parameter -> - val typeName = parameter.type.toString() - val type = subclass.typeParameters.find { it.name.asString() == typeName }?.bounds?.firstOrNull() - ?: typeName - parameter.name!!.asString() to type - } - parameters.forEach { (name, _) -> - writer.write(" element(\"$name\")\n") - } - writer.write(" }\n\n") - - writer.write(" override fun serialize(encoder: Encoder, value: $name<$typeParams>) =\n") - writer.write(" encoder.encodeStructure(descriptor) {\n") - parameters.forEachIndexed { index, (name, type) -> - writer.write( - " encodeSerializableElement(descriptor, $index, PolymorphicSerializer($type::class), value.$name)\n" - ) - } - writer.write(" }\n") - - writer.write( - " override fun deserialize(decoder: Decoder): $name<$typeParams> = decoder.decodeStructure(descriptor) {\n" - ) - parameters.forEach { (name, type) -> - writer.write(" var $name: $type? = null\n") - } - writer.write(" while (true) {\n") - writer.write(" when (val index = decodeElementIndex(descriptor)) {\n") - parameters.forEachIndexed { index, (name, type) -> - writer.write( - " $index -> $name = decodeSerializableElement(descriptor, 0, PolymorphicSerializer($type::class))\n" - ) - } - writer.write(" CompositeDecoder.DECODE_DONE -> break\n") - writer.write(" else -> error(\"Unexpected index: \$index\")") - writer.write(" }\n") - writer.write(" }\n") - writer.write(" $name(\n") - parameters.forEach { (name, _) -> - writer.write(" $name = $name ?: error(\"Missing $name\"),\n") - } - writer.write(" )\n") - writer.write(" }\n") - - writer.write("}\n") - } } return emptyList() diff --git a/subprojects/common/ksp-processor/src/main/kotlin/hu/bme/mit/theta/ksp/PolymorphicModuleProcessorProvider.kt b/subprojects/common/ksp-processor/src/main/kotlin/hu/bme/mit/theta/ksp/PolymorphicModuleProcessorProvider.kt index 2b502a9dd8..f2d5f2d609 100644 --- a/subprojects/common/ksp-processor/src/main/kotlin/hu/bme/mit/theta/ksp/PolymorphicModuleProcessorProvider.kt +++ b/subprojects/common/ksp-processor/src/main/kotlin/hu/bme/mit/theta/ksp/PolymorphicModuleProcessorProvider.kt @@ -4,15 +4,18 @@ import com.google.devtools.ksp.processing.* sealed class PolymorphicModuleProcessorProvider( private val pack: String, - private val topLevelClass: String, + private val baseClass: String, ) : SymbolProcessorProvider { override fun create(environment: SymbolProcessorEnvironment): SymbolProcessor = - PolymorphicModuleProcessor(environment.codeGenerator, environment.logger, pack, topLevelClass) + PolymorphicModuleProcessor(environment.codeGenerator, environment.logger, pack, baseClass) } class TypeSerializerProcessorProvider : PolymorphicModuleProcessorProvider("hu.bme.mit.theta.core.type", "Type") +class DeclSerializerProcessorProvider : + PolymorphicModuleProcessorProvider("hu.bme.mit.theta.core.decl", "Decl") + class StmtSerializerProcessorProvider : PolymorphicModuleProcessorProvider("hu.bme.mit.theta.core.stmt", "Stmt") diff --git a/subprojects/common/ksp-processor/src/main/resources/META-INF/services/com.google.devtools.ksp.processing.SymbolProcessorProvider b/subprojects/common/ksp-processor/src/main/resources/META-INF/services/com.google.devtools.ksp.processing.SymbolProcessorProvider index 1bb1650532..13272e6dd1 100644 --- a/subprojects/common/ksp-processor/src/main/resources/META-INF/services/com.google.devtools.ksp.processing.SymbolProcessorProvider +++ b/subprojects/common/ksp-processor/src/main/resources/META-INF/services/com.google.devtools.ksp.processing.SymbolProcessorProvider @@ -1,3 +1,4 @@ hu.bme.mit.theta.ksp.TypeSerializerProcessorProvider +hu.bme.mit.theta.ksp.DeclSerializerProcessorProvider hu.bme.mit.theta.ksp.StmtSerializerProcessorProvider hu.bme.mit.theta.ksp.ExprSerializerProcessorProvider \ No newline at end of file From fc09da7c8f702fa29e42f47633a8475bad035f65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Csan=C3=A1d=20Telbisz?= Date: Thu, 26 Jun 2025 13:55:02 +0200 Subject: [PATCH 30/48] formatting --- .../bme/mit/theta/core/decl/BasicConstDecl.kt | 56 ++-- .../mit/theta/core/decl/IndexedConstDecl.kt | 75 +++--- .../hu/bme/mit/theta/core/decl/ParamDecl.kt | 66 +++-- .../hu/bme/mit/theta/core/decl/VarDecl.kt | 79 +++--- .../core/serialization/SerializerModule.kt | 13 +- .../hu/bme/mit/theta/core/stmt/AssignStmt.kt | 18 +- .../hu/bme/mit/theta/core/stmt/AssumeStmt.kt | 16 +- .../hu/bme/mit/theta/core/stmt/HavocStmt.kt | 11 +- .../mit/theta/core/stmt/MemoryAssignStmt.kt | 28 +- .../theta/core/type/anytype/Dereference.kt | 38 ++- .../theta/core/type/anytype/InvalidLitExpr.kt | 10 +- .../mit/theta/core/type/anytype/IteExpr.kt | 30 ++- .../mit/theta/core/type/anytype/PrimeExpr.kt | 11 +- .../mit/theta/core/type/anytype/RefExpr.kt | 11 +- .../mit/theta/core/type/anytype/Reference.kt | 13 +- .../theta/core/type/arraytype/ArrayEqExpr.kt | 23 +- .../core/type/arraytype/ArrayInitExpr.kt | 55 +++- .../theta/core/type/arraytype/ArrayLitExpr.kt | 75 ++++-- .../theta/core/type/arraytype/ArrayNeqExpr.kt | 23 +- .../core/type/arraytype/ArrayReadExpr.kt | 23 +- .../theta/core/type/arraytype/ArrayType.kt | 51 ++-- .../core/type/arraytype/ArrayWriteExpr.kt | 30 ++- .../theta/core/type/functype/FuncAppExpr.kt | 23 +- .../theta/core/type/functype/FuncLitExpr.kt | 27 +- .../mit/theta/core/type/functype/FuncType.kt | 58 ++-- .../mit/theta/core/expr/EvaluationTest.java | 25 +- .../theta/core/utils/ExprCanonizerTest.java | 33 ++- .../theta/core/utils/ExprSimplifierTest.java | 39 ++- .../serialization/StmtSerializationTest.kt | 218 ++++++++------- .../serialization/TypeSerializationTest.kt | 251 +++++++++--------- .../theta/ksp/PolymorphicModuleProcessor.kt | 15 ++ .../ksp/PolymorphicModuleProcessorProvider.kt | 15 ++ 32 files changed, 828 insertions(+), 631 deletions(-) diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/BasicConstDecl.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/BasicConstDecl.kt index 3629054218..a4bd8b7f1b 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/BasicConstDecl.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/BasicConstDecl.kt @@ -33,39 +33,37 @@ import kotlinx.serialization.encoding.* @Serializable(with = BasicConstDecl.Serializer::class) @SerialName("BasicConstDecl") data class BasicConstDecl(override val name: String, override val type: DeclType) : - ConstDecl() { + ConstDecl() { - object Serializer : KSerializer> { + object Serializer : KSerializer> { - override val descriptor: SerialDescriptor = buildClassSerialDescriptor("BasicConstDecl") { - element("name") - element("type") - } + override val descriptor: SerialDescriptor = + buildClassSerialDescriptor("BasicConstDecl") { + element("name") + element("type") + } - override fun serialize(encoder: Encoder, value: BasicConstDecl) = - encoder.encodeStructure(descriptor) { - encodeStringElement(descriptor, 0, value.name) - encodeSerializableElement(descriptor, 1, PolymorphicSerializer(Type::class), value.type) - } + override fun serialize(encoder: Encoder, value: BasicConstDecl) = + encoder.encodeStructure(descriptor) { + encodeStringElement(descriptor, 0, value.name) + encodeSerializableElement(descriptor, 1, PolymorphicSerializer(Type::class), value.type) + } - override fun deserialize(decoder: Decoder): BasicConstDecl = - decoder.decodeStructure(descriptor) { - var name: String? = null - var type: Type? = null + override fun deserialize(decoder: Decoder): BasicConstDecl = + decoder.decodeStructure(descriptor) { + var name: String? = null + var type: Type? = null - while (true) { - when (val index = decodeElementIndex(descriptor)) { - 0 -> name = decodeStringElement(descriptor, 0) - 1 -> type = decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Type::class)) - CompositeDecoder.DECODE_DONE -> break - else -> error("Unexpected index: $index") - } - } + while (true) { + when (val index = decodeElementIndex(descriptor)) { + 0 -> name = decodeStringElement(descriptor, 0) + 1 -> type = decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Type::class)) + CompositeDecoder.DECODE_DONE -> break + else -> error("Unexpected index: $index") + } + } - BasicConstDecl( - name = name ?: error("Missing name"), - type = type ?: error("Missing type") - ) - } - } + BasicConstDecl(name = name ?: error("Missing name"), type = type ?: error("Missing type")) + } + } } diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/IndexedConstDecl.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/IndexedConstDecl.kt index bf554bee02..6d5f5bbf07 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/IndexedConstDecl.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/IndexedConstDecl.kt @@ -31,49 +31,50 @@ import kotlinx.serialization.encoding.* @Serializable(with = IndexedConstDecl.Serializer::class) @SerialName("IndexedConstDecl") data class IndexedConstDecl(val varDecl: VarDecl, val index: Int) : - ConstDecl() { + ConstDecl() { - init { - require(index >= 0) { "Index must be non-negative" } - } + init { + require(index >= 0) { "Index must be non-negative" } + } - companion object { + companion object { - private const val NAME_FORMAT: String = "_%s:%d" - } + private const val NAME_FORMAT: String = "_%s:%d" + } - override val name: String = String.format(NAME_FORMAT, varDecl.name, index) - override val type: DeclType = varDecl.type + override val name: String = String.format(NAME_FORMAT, varDecl.name, index) + override val type: DeclType = varDecl.type - object Serializer : KSerializer> { + object Serializer : KSerializer> { - override val descriptor: SerialDescriptor = buildClassSerialDescriptor("IndexedConstDecl") { - element>("varDecl") - element("index") - } + override val descriptor: SerialDescriptor = + buildClassSerialDescriptor("IndexedConstDecl") { + element>("varDecl") + element("index") + } - override fun serialize(encoder: Encoder, value: IndexedConstDecl) = - encoder.encodeStructure(descriptor) { - encodeSerializableElement(descriptor, 0, VarDecl.Serializer, value.varDecl) - encodeIntElement(descriptor, 1, value.index) - } + override fun serialize(encoder: Encoder, value: IndexedConstDecl) = + encoder.encodeStructure(descriptor) { + encodeSerializableElement(descriptor, 0, VarDecl.Serializer, value.varDecl) + encodeIntElement(descriptor, 1, value.index) + } - override fun deserialize(decoder: Decoder): IndexedConstDecl = - decoder.decodeStructure(descriptor) { - var varDecl: VarDecl? = null - var index: Int? = null - while (true) { - when (val i = decodeElementIndex(descriptor)) { - 0 -> varDecl = decodeSerializableElement(descriptor, 0, VarDecl.Serializer) - 1 -> index = decodeIntElement(descriptor, 1) - CompositeDecoder.DECODE_DONE -> break - else -> throw SerializationException("Unknown index $i") - } - } - IndexedConstDecl( - varDecl = varDecl ?: error("Missing varDecl"), - index = index ?: error("Missing index"), - ) - } - } + override fun deserialize(decoder: Decoder): IndexedConstDecl = + decoder.decodeStructure(descriptor) { + var varDecl: VarDecl? = null + var index: Int? = null + while (true) { + when (val i = decodeElementIndex(descriptor)) { + 0 -> varDecl = decodeSerializableElement(descriptor, 0, VarDecl.Serializer) + 1 -> index = decodeIntElement(descriptor, 1) + CompositeDecoder.DECODE_DONE -> break + else -> throw SerializationException("Unknown index $i") + } + } + IndexedConstDecl( + varDecl = varDecl ?: error("Missing varDecl"), + index = index ?: error("Missing index"), + ) + } + } } diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/ParamDecl.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/ParamDecl.kt index 9787150b9a..f1a3a6407d 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/ParamDecl.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/ParamDecl.kt @@ -29,47 +29,45 @@ import kotlinx.serialization.encoding.* @Serializable(with = ParamDecl.Serializer::class) @SerialName(ParamDecl.DECL_LABEL) data class ParamDecl(override val name: String, override val type: DeclType) : - Decl() { + Decl() { - companion object { + companion object { - internal const val DECL_LABEL: String = "Param" - } + internal const val DECL_LABEL: String = "Param" + } - override fun toString(): String = - Utils.lispStringBuilder(DECL_LABEL).add(name).add(type).toString() + override fun toString(): String = + Utils.lispStringBuilder(DECL_LABEL).add(name).add(type).toString() - object Serializer : KSerializer> { + object Serializer : KSerializer> { - override val descriptor: SerialDescriptor = buildClassSerialDescriptor("ParamDecl") { - element("name") - element("type") - } + override val descriptor: SerialDescriptor = + buildClassSerialDescriptor("ParamDecl") { + element("name") + element("type") + } - override fun serialize(encoder: Encoder, value: ParamDecl) = - encoder.encodeStructure(descriptor) { - encodeStringElement(descriptor, 0, value.name) - encodeSerializableElement(descriptor, 1, PolymorphicSerializer(Type::class), value.type) - } + override fun serialize(encoder: Encoder, value: ParamDecl) = + encoder.encodeStructure(descriptor) { + encodeStringElement(descriptor, 0, value.name) + encodeSerializableElement(descriptor, 1, PolymorphicSerializer(Type::class), value.type) + } - override fun deserialize(decoder: Decoder): ParamDecl = - decoder.decodeStructure(descriptor) { - var name: String? = null - var type: Type? = null + override fun deserialize(decoder: Decoder): ParamDecl = + decoder.decodeStructure(descriptor) { + var name: String? = null + var type: Type? = null - while (true) { - when (val index = decodeElementIndex(descriptor)) { - 0 -> name = decodeStringElement(descriptor, 0) - 1 -> type = decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Type::class)) - CompositeDecoder.DECODE_DONE -> break - else -> error("Unexpected index: $index") - } - } + while (true) { + when (val index = decodeElementIndex(descriptor)) { + 0 -> name = decodeStringElement(descriptor, 0) + 1 -> type = decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Type::class)) + CompositeDecoder.DECODE_DONE -> break + else -> error("Unexpected index: $index") + } + } - ParamDecl( - name = name ?: error("Missing name"), - type = type ?: error("Missing type") - ) - } - } + ParamDecl(name = name ?: error("Missing name"), type = type ?: error("Missing type")) + } + } } diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/VarDecl.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/VarDecl.kt index 440a31d9f1..db2b97c0b2 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/VarDecl.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/VarDecl.kt @@ -33,57 +33,54 @@ import kotlinx.serialization.encoding.* @Serializable(with = VarDecl.Serializer::class) @SerialName(VarDecl.DECL_LABEL) data class VarDecl(override val name: String, override val type: DeclType) : - Decl() { + Decl() { - companion object { + companion object { - internal const val DECL_LABEL: String = "var" + internal const val DECL_LABEL: String = "var" - fun copyOf(from: VarDecl): VarDecl = VarDecl(from.name, from.type) - } + fun copyOf(from: VarDecl): VarDecl = VarDecl(from.name, from.type) + } - @Transient - private val indexToConst = mutableMapOf>() + @Transient private val indexToConst = mutableMapOf>() - fun getConstDecl(index: Int): IndexedConstDecl { - require(index >= 0) { "Index must be non-negative" } - return indexToConst.getOrPut(index) { IndexedConstDecl(this, index) } - } + fun getConstDecl(index: Int): IndexedConstDecl { + require(index >= 0) { "Index must be non-negative" } + return indexToConst.getOrPut(index) { IndexedConstDecl(this, index) } + } - override fun toString(): String = - Utils.lispStringBuilder(DECL_LABEL).add(name).add(type).toString() + override fun toString(): String = + Utils.lispStringBuilder(DECL_LABEL).add(name).add(type).toString() - object Serializer : KSerializer> { + object Serializer : KSerializer> { - override val descriptor: SerialDescriptor = buildClassSerialDescriptor("VarDecl") { - element("name") - element("type") - } + override val descriptor: SerialDescriptor = + buildClassSerialDescriptor("VarDecl") { + element("name") + element("type") + } - override fun serialize(encoder: Encoder, value: VarDecl) = - encoder.encodeStructure(descriptor) { - encodeStringElement(descriptor, 0, value.name) - encodeSerializableElement(descriptor, 1, PolymorphicSerializer(Type::class), value.type) - } + override fun serialize(encoder: Encoder, value: VarDecl) = + encoder.encodeStructure(descriptor) { + encodeStringElement(descriptor, 0, value.name) + encodeSerializableElement(descriptor, 1, PolymorphicSerializer(Type::class), value.type) + } - override fun deserialize(decoder: Decoder): VarDecl = - decoder.decodeStructure(descriptor) { - var name: String? = null - var type: Type? = null + override fun deserialize(decoder: Decoder): VarDecl = + decoder.decodeStructure(descriptor) { + var name: String? = null + var type: Type? = null - while (true) { - when (val index = decodeElementIndex(descriptor)) { - 0 -> name = decodeStringElement(descriptor, 0) - 1 -> type = decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Type::class)) - CompositeDecoder.DECODE_DONE -> break - else -> error("Unexpected index: $index") - } - } + while (true) { + when (val index = decodeElementIndex(descriptor)) { + 0 -> name = decodeStringElement(descriptor, 0) + 1 -> type = decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Type::class)) + CompositeDecoder.DECODE_DONE -> break + else -> error("Unexpected index: $index") + } + } - VarDecl( - name = name ?: error("Missing name"), - type = type ?: error("Missing type") - ) - } - } + VarDecl(name = name ?: error("Missing name"), type = type ?: error("Missing type")) + } + } } diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/serialization/SerializerModule.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/serialization/SerializerModule.kt index 45ef4a542a..047e0a1fa3 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/serialization/SerializerModule.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/serialization/SerializerModule.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.serialization import hu.bme.mit.theta.core.decl.generated.declSerializerModule @@ -24,13 +23,13 @@ import kotlinx.serialization.json.Json import kotlinx.serialization.modules.SerializersModule val coreSerializerModule = SerializersModule { - include(typeSerializerModule) - include(declSerializerModule) - include(stmtSerializerModule) - include(exprSerializerModule) + include(typeSerializerModule) + include(declSerializerModule) + include(stmtSerializerModule) + include(exprSerializerModule) } val coreJson = Json { - serializersModule = coreSerializerModule - classDiscriminator = "class" + serializersModule = coreSerializerModule + classDiscriminator = "class" } diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/AssignStmt.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/AssignStmt.kt index e712f9ab9f..9f73b8a9c1 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/AssignStmt.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/AssignStmt.kt @@ -60,10 +60,11 @@ data class AssignStmt(val varDecl: VarDecl, val expr: Utils.lispStringBuilder(STMT_LABEL).add(varDecl.name).add(expr).toString() object Serializer : KSerializer> { - override val descriptor: SerialDescriptor = buildClassSerialDescriptor("AssignStmt") { - element>("varDecl") - element>("expr") - } + override val descriptor: SerialDescriptor = + buildClassSerialDescriptor("AssignStmt") { + element>("varDecl") + element>("expr") + } override fun serialize(encoder: Encoder, value: AssignStmt) = encoder.encodeStructure(descriptor) { @@ -77,8 +78,13 @@ data class AssignStmt(val varDecl: VarDecl, val expr: var expr: Expr? = null while (true) { when (val i = decodeElementIndex(descriptor)) { - 0 -> varDecl = decodeSerializableElement(descriptor, 0, VarDecl.Serializer) as VarDecl - 1 -> expr = decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class)) as Expr + 0 -> + varDecl = + decodeSerializableElement(descriptor, 0, VarDecl.Serializer) as VarDecl + 1 -> + expr = + decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class)) + as Expr CompositeDecoder.DECODE_DONE -> break else -> throw SerializationException("Unknown index $i") } diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/AssumeStmt.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/AssumeStmt.kt index a49162a633..0dccaf9073 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/AssumeStmt.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/AssumeStmt.kt @@ -52,26 +52,28 @@ data class AssumeStmt(val cond: Expr) : Stmt { override fun toString(): String = Utils.lispStringBuilder(STMT_LABEL).add(cond).toString() object Serializer : KSerializer { - override val descriptor: SerialDescriptor = buildClassSerialDescriptor("AssumeStmt") { - element>("cond") - } + override val descriptor: SerialDescriptor = + buildClassSerialDescriptor("AssumeStmt") { element>("cond") } + override fun serialize(encoder: Encoder, value: AssumeStmt) = encoder.encodeStructure(descriptor) { encodeSerializableElement(descriptor, 0, PolymorphicSerializer(Expr::class), value.cond) } + override fun deserialize(decoder: Decoder): AssumeStmt = decoder.decodeStructure(descriptor) { var cond: Expr? = null while (true) { when (val i = decodeElementIndex(descriptor)) { - 0 -> cond = decodeSerializableElement(descriptor, 0, PolymorphicSerializer(Expr::class)) as Expr + 0 -> + cond = + decodeSerializableElement(descriptor, 0, PolymorphicSerializer(Expr::class)) + as Expr CompositeDecoder.DECODE_DONE -> break else -> throw SerializationException("Unknown index $i") } } - AssumeStmt( - cond = cond ?: throw SerializationException("Missing cond") - ) + AssumeStmt(cond = cond ?: throw SerializationException("Missing cond")) } } } diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/HavocStmt.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/HavocStmt.kt index 0577fdfa5f..9407b668ae 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/HavocStmt.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/HavocStmt.kt @@ -45,13 +45,14 @@ data class HavocStmt(val varDecl: VarDecl) : Stmt { override fun toString(): String = Utils.lispStringBuilder(STMT_LABEL).add(varDecl.name).toString() object Serializer : KSerializer> { - override val descriptor = buildClassSerialDescriptor("HavocStmt") { - element>("varDecl") - } + override val descriptor = + buildClassSerialDescriptor("HavocStmt") { element>("varDecl") } + override fun serialize(encoder: Encoder, value: HavocStmt) = encoder.encodeStructure(descriptor) { encodeSerializableElement(descriptor, 0, VarDecl.Serializer, value.varDecl) } + override fun deserialize(decoder: Decoder): HavocStmt = decoder.decodeStructure(descriptor) { var varDecl: VarDecl? = null @@ -62,9 +63,7 @@ data class HavocStmt(val varDecl: VarDecl) : Stmt { else -> throw SerializationException("Unknown index $i") } } - HavocStmt( - varDecl = varDecl ?: throw SerializationException("Missing varDecl"), - ) + HavocStmt(varDecl = varDecl ?: throw SerializationException("Missing varDecl")) } } } diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/MemoryAssignStmt.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/MemoryAssignStmt.kt index 7af06d2c7e..9af54d0107 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/MemoryAssignStmt.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/stmt/MemoryAssignStmt.kt @@ -67,30 +67,42 @@ data class MemoryAssignStmt( Utils.lispStringBuilder(STMT_LABEL).add(deref).add(expr).toString() object Serializer : KSerializer> { - override val descriptor: SerialDescriptor = buildClassSerialDescriptor("MemoryAssignStmt") { - element>("deref") - element>("expr") - } - override fun serialize(encoder: Encoder, value: MemoryAssignStmt) = + override val descriptor: SerialDescriptor = + buildClassSerialDescriptor("MemoryAssignStmt") { + element>("deref") + element>("expr") + } + + override fun serialize( + encoder: Encoder, + value: MemoryAssignStmt, + ) = encoder.encodeStructure(descriptor) { encodeSerializableElement(descriptor, 0, Dereference.Serializer, value.deref) encodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class), value.expr) } + override fun deserialize(decoder: Decoder): MemoryAssignStmt = decoder.decodeStructure(descriptor) { var deref: Dereference? = null var expr: Expr? = null while (true) { when (val i = decodeElementIndex(descriptor)) { - 0 -> deref = decodeSerializableElement(descriptor, 0, Dereference.Serializer) as Dereference - 1 -> expr = decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class)) as Expr + 0 -> + deref = + decodeSerializableElement(descriptor, 0, Dereference.Serializer) + as Dereference + 1 -> + expr = + decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class)) + as Expr CompositeDecoder.DECODE_DONE -> break else -> throw SerializationException("Unknown index $i") } } MemoryAssignStmt( deref ?: throw SerializationException("Missing deref "), - expr ?: throw SerializationException("Missing expr ") + expr ?: throw SerializationException("Missing expr "), ) } } diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/Dereference.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/Dereference.kt index 35347ded5b..b1f8785ca7 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/Dereference.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/Dereference.kt @@ -92,19 +92,25 @@ data class Dereference( object Serializer : KSerializer> { - override val descriptor: SerialDescriptor = buildClassSerialDescriptor("Dereference") { - element>("array") - element>("offset") - element("type") - element?>("uniquenessIdx") - } + override val descriptor: SerialDescriptor = + buildClassSerialDescriptor("Dereference") { + element>("array") + element>("offset") + element("type") + element?>("uniquenessIdx") + } override fun serialize(encoder: Encoder, value: Dereference) = encoder.encodeStructure(descriptor) { encodeSerializableElement(descriptor, 0, PolymorphicSerializer(Expr::class), value.array) encodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class), value.offset) encodeSerializableElement(descriptor, 2, PolymorphicSerializer(Type::class), value.type) - encodeSerializableElement(descriptor, 3, PolymorphicSerializer(Expr::class).nullable, value.uniquenessIdx) + encodeSerializableElement( + descriptor, + 3, + PolymorphicSerializer(Expr::class).nullable, + value.uniquenessIdx, + ) } override fun deserialize(decoder: Decoder): Dereference = @@ -115,11 +121,19 @@ data class Dereference( var uniquenessIdx: Expr? = null while (true) { when (val i = decodeElementIndex(descriptor)) { - 0 -> array = decodeSerializableElement(descriptor, 0, PolymorphicSerializer(Expr::class)) - 1 -> offset = decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class)) + 0 -> + array = decodeSerializableElement(descriptor, 0, PolymorphicSerializer(Expr::class)) + 1 -> + offset = decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class)) 2 -> type = decodeSerializableElement(descriptor, 2, PolymorphicSerializer(Type::class)) - 3 -> uniquenessIdx = - decodeSerializableElement(descriptor, 3, PolymorphicSerializer(Expr::class).nullable) as Expr? + 3 -> + uniquenessIdx = + decodeSerializableElement( + descriptor, + 3, + PolymorphicSerializer(Expr::class).nullable, + ) + as Expr? CompositeDecoder.DECODE_DONE -> break else -> throw SerializationException("Unknown index $i") @@ -129,7 +143,7 @@ data class Dereference( array ?: throw SerializationException("Missing array "), offset ?: throw SerializationException("Missing offset "), type ?: throw SerializationException("Missing type "), - uniquenessIdx + uniquenessIdx, ) } } diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/InvalidLitExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/InvalidLitExpr.kt index 1836fbaf14..0675d3b287 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/InvalidLitExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/InvalidLitExpr.kt @@ -41,13 +41,13 @@ data class InvalidLitExpr(override val type: ExprType) : override fun equals(other: Any?): Boolean = false object Serializer : KSerializer> { - override val descriptor = buildClassSerialDescriptor("InvalidLit") { - element("type") - } + override val descriptor = buildClassSerialDescriptor("InvalidLit") { element("type") } + override fun serialize(encoder: Encoder, value: InvalidLitExpr) = encoder.encodeStructure(descriptor) { encodeSerializableElement(descriptor, 0, PolymorphicSerializer(Type::class), value.type) } + override fun deserialize(decoder: Decoder): InvalidLitExpr = decoder.decodeStructure(descriptor) { var type: Type? = null @@ -58,9 +58,7 @@ data class InvalidLitExpr(override val type: ExprType) : else -> throw SerializationException("Unknown index $i") } } - InvalidLitExpr( - type = type ?: throw SerializationException("Missing type ") - ) + InvalidLitExpr(type = type ?: throw SerializationException("Missing type ")) } } } diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/IteExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/IteExpr.kt index baa5cbb9b1..66bad09420 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/IteExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/IteExpr.kt @@ -104,17 +104,20 @@ data class IteExpr( Utils.lispStringBuilder(OPERATOR_LABEL).add(cond).add(then).add(elze).toString() object Serializer : KSerializer> { - override val descriptor: SerialDescriptor = buildClassSerialDescriptor("Ite") { - element>("cond") - element>("then") - element>("elze") - } + override val descriptor: SerialDescriptor = + buildClassSerialDescriptor("Ite") { + element>("cond") + element>("then") + element>("elze") + } + override fun serialize(encoder: Encoder, value: IteExpr) = encoder.encodeStructure(descriptor) { encodeSerializableElement(descriptor, 0, PolymorphicSerializer(Expr::class), value.cond) encodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class), value.then) encodeSerializableElement(descriptor, 2, PolymorphicSerializer(Expr::class), value.elze) } + override fun deserialize(decoder: Decoder): IteExpr = decoder.decodeStructure(descriptor) { var cond: Expr? = null @@ -122,9 +125,18 @@ data class IteExpr( var elze: Expr? = null while (true) { when (val i = decodeElementIndex(descriptor)) { - 0 -> cond = decodeSerializableElement(descriptor, 0, PolymorphicSerializer(Expr::class)) as Expr - 1 -> then = decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class)) as Expr - 2 -> elze = decodeSerializableElement(descriptor, 2, PolymorphicSerializer(Expr::class)) as Expr + 0 -> + cond = + decodeSerializableElement(descriptor, 0, PolymorphicSerializer(Expr::class)) + as Expr + 1 -> + then = + decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class)) + as Expr + 2 -> + elze = + decodeSerializableElement(descriptor, 2, PolymorphicSerializer(Expr::class)) + as Expr CompositeDecoder.DECODE_DONE -> break else -> throw SerializationException("Unknown index $i") } @@ -132,7 +144,7 @@ data class IteExpr( IteExpr( cond ?: throw SerializationException("Missing cond "), then ?: throw SerializationException("Missing then "), - elze ?: throw SerializationException("Missing elze ") + elze ?: throw SerializationException("Missing elze "), ) } } diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/PrimeExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/PrimeExpr.kt index f353bbedd1..8afb7b7a78 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/PrimeExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/PrimeExpr.kt @@ -54,13 +54,14 @@ data class PrimeExpr(override val op: Expr) : override val operatorLabel: String = OPERATOR_LABEL object Serializer : KSerializer> { - override val descriptor: SerialDescriptor = buildClassSerialDescriptor("Prime") { - element>("op") - } + override val descriptor: SerialDescriptor = + buildClassSerialDescriptor("Prime") { element>("op") } + override fun serialize(encoder: Encoder, value: PrimeExpr) = encoder.encodeStructure(descriptor) { encodeSerializableElement(descriptor, 0, PolymorphicSerializer(Expr::class), value.op) } + override fun deserialize(decoder: Decoder): PrimeExpr = decoder.decodeStructure(descriptor) { var op: Expr? = null @@ -71,9 +72,7 @@ data class PrimeExpr(override val op: Expr) : else -> throw SerializationException("Unknown index $i") } } - PrimeExpr( - op = op ?: throw SerializationException("Missing op ") - ) + PrimeExpr(op = op ?: throw SerializationException("Missing op ")) } } } diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/RefExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/RefExpr.kt index 9854eeeea7..993c79b750 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/RefExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/RefExpr.kt @@ -50,13 +50,14 @@ data class RefExpr(val decl: Decl) : NullaryExpr> { - override val descriptor: SerialDescriptor = buildClassSerialDescriptor("Ref") { - element>("decl") - } + override val descriptor: SerialDescriptor = + buildClassSerialDescriptor("Ref") { element>("decl") } + override fun serialize(encoder: Encoder, value: RefExpr) = encoder.encodeStructure(descriptor) { encodeSerializableElement(descriptor, 0, PolymorphicSerializer(Decl::class), value.decl) } + override fun deserialize(decoder: Decoder): RefExpr = decoder.decodeStructure(descriptor) { var decl: Decl? = null @@ -67,9 +68,7 @@ data class RefExpr(val decl: Decl) : NullaryExpr throw SerializationException("Unknown index $i") } } - RefExpr( - decl = decl ?: throw SerializationException("Missing decl ") - ) + RefExpr(decl = decl ?: throw SerializationException("Missing decl ")) } } } diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/Reference.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/Reference.kt index ae50c1a211..c2736ed934 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/Reference.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/Reference.kt @@ -60,15 +60,18 @@ data class Reference(val expr: Expr, override val type: A } object Serializer : KSerializer> { - override val descriptor: SerialDescriptor = buildClassSerialDescriptor("Reference") { - element>("expr") - element("type") - } + override val descriptor: SerialDescriptor = + buildClassSerialDescriptor("Reference") { + element>("expr") + element("type") + } + override fun serialize(encoder: Encoder, value: Reference) = encoder.encodeStructure(descriptor) { encodeSerializableElement(descriptor, 0, PolymorphicSerializer(Expr::class), value.expr) encodeSerializableElement(descriptor, 1, PolymorphicSerializer(Type::class), value.type) } + override fun deserialize(decoder: Decoder): Reference = decoder.decodeStructure(descriptor) { var expr: Expr? = null @@ -83,7 +86,7 @@ data class Reference(val expr: Expr, override val type: A } Reference( expr ?: throw SerializationException("Missing expr "), - type ?: throw SerializationException("Missing type ") + type ?: throw SerializationException("Missing type "), ) } } diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayEqExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayEqExpr.kt index 859a5b87d6..3454b3d7ff 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayEqExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayEqExpr.kt @@ -66,30 +66,39 @@ data class ArrayEqExpr( override fun toString(): String = super.toString() object Serializer : KSerializer> { - override val descriptor: SerialDescriptor = buildClassSerialDescriptor("ArrayEq") { - element>("leftOp") - element>("rightOp") - } + override val descriptor: SerialDescriptor = + buildClassSerialDescriptor("ArrayEq") { + element>("leftOp") + element>("rightOp") + } + override fun serialize(encoder: Encoder, value: ArrayEqExpr) = encoder.encodeStructure(descriptor) { encodeSerializableElement(descriptor, 0, PolymorphicSerializer(Expr::class), value.leftOp) encodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class), value.rightOp) } + override fun deserialize(decoder: Decoder): ArrayEqExpr = decoder.decodeStructure(descriptor) { var leftOp: Expr>? = null var rightOp: Expr>? = null while (true) { when (val i = decodeElementIndex(descriptor)) { - 0 -> leftOp = decodeSerializableElement(descriptor, 0, PolymorphicSerializer(Expr::class)) as Expr> - 1 -> rightOp = decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class)) as Expr> + 0 -> + leftOp = + decodeSerializableElement(descriptor, 0, PolymorphicSerializer(Expr::class)) + as Expr> + 1 -> + rightOp = + decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class)) + as Expr> CompositeDecoder.DECODE_DONE -> break else -> throw SerializationException("Unknown index $i") } } ArrayEqExpr( leftOp ?: throw SerializationException("Missing leftOp "), - rightOp ?: throw SerializationException("Missing rightOp ") + rightOp ?: throw SerializationException("Missing rightOp "), ) } } diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayInitExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayInitExpr.kt index 74609166bf..7728ec86d0 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayInitExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayInitExpr.kt @@ -112,17 +112,32 @@ data class ArrayInitExpr( override fun toString(): String = "arrayinit($elements, $elseElem, $type)" object Serializer : KSerializer> { - override val descriptor: SerialDescriptor = buildClassSerialDescriptor("ArrayInit") { - element, Expr>>>("elements") - element>("elseElem") - element>("type") - } + override val descriptor: SerialDescriptor = + buildClassSerialDescriptor("ArrayInit") { + element, Expr>>>("elements") + element>("elseElem") + element>("type") + } + override fun serialize(encoder: Encoder, value: ArrayInitExpr) = encoder.encodeStructure(descriptor) { - encodeSerializableElement(descriptor, 0, ListSerializer(PairSerializer(PolymorphicSerializer(Expr::class), PolymorphicSerializer(Expr::class))), value.elements) + encodeSerializableElement( + descriptor, + 0, + ListSerializer( + PairSerializer(PolymorphicSerializer(Expr::class), PolymorphicSerializer(Expr::class)) + ), + value.elements, + ) encodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class), value.elseElem) - encodeSerializableElement(descriptor, 2, PolymorphicSerializer(ArrayType::class), value.type) + encodeSerializableElement( + descriptor, + 2, + PolymorphicSerializer(ArrayType::class), + value.type, + ) } + override fun deserialize(decoder: Decoder): ArrayInitExpr = decoder.decodeStructure(descriptor) { var elements: List, Expr>>? = null @@ -130,9 +145,27 @@ data class ArrayInitExpr( var type: ArrayType? = null while (true) { when (val i = decodeElementIndex(descriptor)) { - 0 -> elements = decodeSerializableElement(descriptor, 0, ListSerializer(PairSerializer(PolymorphicSerializer(Expr::class), PolymorphicSerializer(Expr::class)))) as List, Expr>> - 1 -> elseElem = decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class)) as Expr - 2 -> type = decodeSerializableElement(descriptor, 2, PolymorphicSerializer(ArrayType::class)) as ArrayType + 0 -> + elements = + decodeSerializableElement( + descriptor, + 0, + ListSerializer( + PairSerializer( + PolymorphicSerializer(Expr::class), + PolymorphicSerializer(Expr::class), + ) + ), + ) + as List, Expr>> + 1 -> + elseElem = + decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class)) + as Expr + 2 -> + type = + decodeSerializableElement(descriptor, 2, PolymorphicSerializer(ArrayType::class)) + as ArrayType CompositeDecoder.DECODE_DONE -> break else -> throw SerializationException("Unknown index $i") } @@ -140,7 +173,7 @@ data class ArrayInitExpr( ArrayInitExpr( elements ?: throw SerializationException("Missing elements"), elseElem ?: throw SerializationException("Missing elseElem"), - type ?: throw SerializationException("Missing type") + type ?: throw SerializationException("Missing type"), ) } } diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayLitExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayLitExpr.kt index 7446b546ed..4de6c986bf 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayLitExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayLitExpr.kt @@ -80,39 +80,66 @@ data class ArrayLitExpr( .toString() object Serializer : KSerializer> { - override val descriptor: SerialDescriptor = buildClassSerialDescriptor("ArrayLit") { - element("elements") - element("elseElem") - element("type") - } + override val descriptor: SerialDescriptor = + buildClassSerialDescriptor("ArrayLit") { + element("elements") + element("elseElem") + element("type") + } override fun serialize(encoder: Encoder, value: ArrayLitExpr) = encoder.encodeStructure(descriptor) { - encodeSerializableElement(descriptor, 0, ListSerializer(PairSerializer(PolymorphicSerializer(Expr::class), PolymorphicSerializer(Expr::class))), value.elements) + encodeSerializableElement( + descriptor, + 0, + ListSerializer( + PairSerializer(PolymorphicSerializer(Expr::class), PolymorphicSerializer(Expr::class)) + ), + value.elements, + ) encodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class), value.elseElem) encodeSerializableElement(descriptor, 2, PolymorphicSerializer(Type::class), value.type) } - override fun deserialize(decoder: Decoder): ArrayLitExpr = decoder.decodeStructure(descriptor) { - var elements: List, LitExpr>>? = null - var elseElem: LitExpr? = null - var type: ArrayType? = null + override fun deserialize(decoder: Decoder): ArrayLitExpr = + decoder.decodeStructure(descriptor) { + var elements: List, LitExpr>>? = null + var elseElem: LitExpr? = null + var type: ArrayType? = null - while (true) { - when (val index = decodeElementIndex(descriptor)) { - 0 -> elements = decodeSerializableElement(descriptor, 0, ListSerializer(PairSerializer(PolymorphicSerializer(Expr::class), PolymorphicSerializer(Expr::class)))) as List, LitExpr>> - 1 -> elseElem = decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class)) as LitExpr - 2 -> type = decodeSerializableElement(descriptor, 2, PolymorphicSerializer(Type::class)) as ArrayType - CompositeDecoder.DECODE_DONE -> break - else -> error("Unexpected index: $index") + while (true) { + when (val index = decodeElementIndex(descriptor)) { + 0 -> + elements = + decodeSerializableElement( + descriptor, + 0, + ListSerializer( + PairSerializer( + PolymorphicSerializer(Expr::class), + PolymorphicSerializer(Expr::class), + ) + ), + ) + as List, LitExpr>> + 1 -> + elseElem = + decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class)) + as LitExpr + 2 -> + type = + decodeSerializableElement(descriptor, 2, PolymorphicSerializer(Type::class)) + as ArrayType + CompositeDecoder.DECODE_DONE -> break + else -> error("Unexpected index: $index") + } } - } - ArrayLitExpr( - elements = elements ?: error("Missing elements"), - elseElem = elseElem ?: error("Missing elseElem"), - type = type ?: error("Missing type"), - ) - } + ArrayLitExpr( + elements = elements ?: error("Missing elements"), + elseElem = elseElem ?: error("Missing elseElem"), + type = type ?: error("Missing type"), + ) + } } } diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayNeqExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayNeqExpr.kt index 2baebed5b1..17e456378d 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayNeqExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayNeqExpr.kt @@ -65,30 +65,39 @@ data class ArrayNeqExpr( override fun toString(): String = super.toString() object Serializer : KSerializer> { - override val descriptor: SerialDescriptor = buildClassSerialDescriptor("ArrayNeq") { - element>("leftOp") - element>("rightOp") - } + override val descriptor: SerialDescriptor = + buildClassSerialDescriptor("ArrayNeq") { + element>("leftOp") + element>("rightOp") + } + override fun serialize(encoder: Encoder, value: ArrayNeqExpr) = encoder.encodeStructure(descriptor) { encodeSerializableElement(descriptor, 0, PolymorphicSerializer(Expr::class), value.leftOp) encodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class), value.rightOp) } + override fun deserialize(decoder: Decoder): ArrayNeqExpr = decoder.decodeStructure(descriptor) { var leftOp: Expr>? = null var rightOp: Expr>? = null while (true) { when (val i = decodeElementIndex(descriptor)) { - 0 -> leftOp = decodeSerializableElement(descriptor, 0, PolymorphicSerializer(Expr::class)) as Expr> - 1 -> rightOp = decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class)) as Expr> + 0 -> + leftOp = + decodeSerializableElement(descriptor, 0, PolymorphicSerializer(Expr::class)) + as Expr> + 1 -> + rightOp = + decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class)) + as Expr> CompositeDecoder.DECODE_DONE -> break else -> throw SerializationException("Unknown index $i") } } ArrayNeqExpr( leftOp ?: throw SerializationException("Missing leftOp"), - rightOp ?: throw SerializationException("Missing rightOp") + rightOp ?: throw SerializationException("Missing rightOp"), ) } } diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayReadExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayReadExpr.kt index 2af5d06656..2315cdf1d6 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayReadExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayReadExpr.kt @@ -96,30 +96,39 @@ data class ArrayReadExpr( Utils.lispStringBuilder(OPERATOR_LABEL).body().add(array).add(index).toString() object Serializer : KSerializer> { - override val descriptor: SerialDescriptor = buildClassSerialDescriptor("ArrayRead") { - element>("array") - element>("index") - } + override val descriptor: SerialDescriptor = + buildClassSerialDescriptor("ArrayRead") { + element>("array") + element>("index") + } + override fun serialize(encoder: Encoder, value: ArrayReadExpr) = encoder.encodeStructure(descriptor) { encodeSerializableElement(descriptor, 0, PolymorphicSerializer(Expr::class), value.array) encodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class), value.index) } + override fun deserialize(decoder: Decoder): ArrayReadExpr = decoder.decodeStructure(descriptor) { var array: Expr>? = null var index: Expr? = null while (true) { when (val i = decodeElementIndex(descriptor)) { - 0 -> array = decodeSerializableElement(descriptor, 0, PolymorphicSerializer(Expr::class)) as Expr> - 1 -> index = decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class)) as Expr + 0 -> + array = + decodeSerializableElement(descriptor, 0, PolymorphicSerializer(Expr::class)) + as Expr> + 1 -> + index = + decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class)) + as Expr CompositeDecoder.DECODE_DONE -> break else -> throw SerializationException("Unknown index $i") } } ArrayReadExpr( array ?: throw SerializationException("Missing array"), - index ?: throw SerializationException("Missing index") + index ?: throw SerializationException("Missing index"), ) } } diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayType.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayType.kt index eed6e82925..835a974322 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayType.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayType.kt @@ -67,34 +67,45 @@ data class ArrayType( get() = DomainSize.pow(elemType.domainSize, indexType.domainSize) object Serializer : KSerializer> { - override val descriptor: SerialDescriptor = buildClassSerialDescriptor("ArrayType") { - element("indexType") - element("elemType") - } + override val descriptor: SerialDescriptor = + buildClassSerialDescriptor("ArrayType") { + element("indexType") + element("elemType") + } override fun serialize(encoder: Encoder, value: ArrayType) = encoder.encodeStructure(descriptor) { - encodeSerializableElement(descriptor, 0, PolymorphicSerializer(Type::class), value.indexType) + encodeSerializableElement( + descriptor, + 0, + PolymorphicSerializer(Type::class), + value.indexType, + ) encodeSerializableElement(descriptor, 1, PolymorphicSerializer(Type::class), value.elemType) } - override fun deserialize(decoder: Decoder): ArrayType = decoder.decodeStructure(descriptor) { - var indexType: Type? = null - var elemType: Type? = null + override fun deserialize(decoder: Decoder): ArrayType = + decoder.decodeStructure(descriptor) { + var indexType: Type? = null + var elemType: Type? = null - while (true) { - when (val index = decodeElementIndex(descriptor)) { - 0 -> indexType = decodeSerializableElement(descriptor, 0, PolymorphicSerializer(Type::class)) - 1 -> elemType = decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Type::class)) - CompositeDecoder.DECODE_DONE -> break - else -> error("Unexpected index: $index") + while (true) { + when (val index = decodeElementIndex(descriptor)) { + 0 -> + indexType = + decodeSerializableElement(descriptor, 0, PolymorphicSerializer(Type::class)) + 1 -> + elemType = + decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Type::class)) + CompositeDecoder.DECODE_DONE -> break + else -> error("Unexpected index: $index") + } } - } - ArrayType( - indexType = indexType ?: error("Missing indexType"), - elemType = elemType ?: error("Missing elemType") - ) - } + ArrayType( + indexType = indexType ?: error("Missing indexType"), + elemType = elemType ?: error("Missing elemType"), + ) + } } } diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayWriteExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayWriteExpr.kt index 06846af5d9..89d9420f9a 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayWriteExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayWriteExpr.kt @@ -102,17 +102,20 @@ data class ArrayWriteExpr( fun withElem(elem: Expr): ArrayWriteExpr = with(array, index, elem) object Serializer : KSerializer> { - override val descriptor: SerialDescriptor = buildClassSerialDescriptor("ArrayWrite") { - element>("array") - element>("index") - element>("elem") - } + override val descriptor: SerialDescriptor = + buildClassSerialDescriptor("ArrayWrite") { + element>("array") + element>("index") + element>("elem") + } + override fun serialize(encoder: Encoder, value: ArrayWriteExpr) = encoder.encodeStructure(descriptor) { encodeSerializableElement(descriptor, 0, PolymorphicSerializer(Expr::class), value.array) encodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class), value.index) encodeSerializableElement(descriptor, 2, PolymorphicSerializer(Expr::class), value.elem) } + override fun deserialize(decoder: Decoder): ArrayWriteExpr = decoder.decodeStructure(descriptor) { var array: Expr>? = null @@ -120,9 +123,18 @@ data class ArrayWriteExpr( var elem: Expr? = null while (true) { when (val i = decodeElementIndex(descriptor)) { - 0 -> array = decodeSerializableElement(descriptor, 0, PolymorphicSerializer(Expr::class)) as Expr> - 1 -> index = decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class)) as Expr - 2 -> elem = decodeSerializableElement(descriptor, 2, PolymorphicSerializer(Expr::class)) as Expr + 0 -> + array = + decodeSerializableElement(descriptor, 0, PolymorphicSerializer(Expr::class)) + as Expr> + 1 -> + index = + decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class)) + as Expr + 2 -> + elem = + decodeSerializableElement(descriptor, 2, PolymorphicSerializer(Expr::class)) + as Expr CompositeDecoder.DECODE_DONE -> break else -> throw SerializationException("Unknown index $i") } @@ -130,7 +142,7 @@ data class ArrayWriteExpr( ArrayWriteExpr( array ?: throw SerializationException("Missing array"), index ?: throw SerializationException("Missing index"), - elem ?: throw SerializationException("Missing elem") + elem ?: throw SerializationException("Missing elem"), ) } } diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/functype/FuncAppExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/functype/FuncAppExpr.kt index 93b3c6ba66..02310e4436 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/functype/FuncAppExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/functype/FuncAppExpr.kt @@ -81,30 +81,39 @@ data class FuncAppExpr( override fun toString(): String = Utils.lispStringBuilder().add(func).body().add(param).toString() object Serializer : KSerializer> { - override val descriptor: SerialDescriptor = buildClassSerialDescriptor("FuncApp") { - element>("func") - element>("param") - } + override val descriptor: SerialDescriptor = + buildClassSerialDescriptor("FuncApp") { + element>("func") + element>("param") + } + override fun serialize(encoder: Encoder, value: FuncAppExpr) = encoder.encodeStructure(descriptor) { encodeSerializableElement(descriptor, 0, PolymorphicSerializer(Expr::class), value.func) encodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class), value.param) } + override fun deserialize(decoder: Decoder): FuncAppExpr = decoder.decodeStructure(descriptor) { var func: Expr>? = null var param: Expr? = null while (true) { when (val i = decodeElementIndex(descriptor)) { - 0 -> func = decodeSerializableElement(descriptor, 0, PolymorphicSerializer(Expr::class)) as Expr> - 1 -> param = decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class)) as Expr + 0 -> + func = + decodeSerializableElement(descriptor, 0, PolymorphicSerializer(Expr::class)) + as Expr> + 1 -> + param = + decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class)) + as Expr CompositeDecoder.DECODE_DONE -> break else -> throw SerializationException("Unknown index $i") } } FuncAppExpr( func ?: throw SerializationException("Missing func"), - param ?: throw SerializationException("Missing param") + param ?: throw SerializationException("Missing param"), ) } } diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/functype/FuncLitExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/functype/FuncLitExpr.kt index 033d1f6713..c7b964730b 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/functype/FuncLitExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/functype/FuncLitExpr.kt @@ -67,30 +67,41 @@ data class FuncLitExpr( } object Serializer : KSerializer> { - override val descriptor: SerialDescriptor = buildClassSerialDescriptor("FuncLit") { - element>("param") - element>("result") - } + override val descriptor: SerialDescriptor = + buildClassSerialDescriptor("FuncLit") { + element>("param") + element>("result") + } + override fun serialize(encoder: Encoder, value: FuncLitExpr) = encoder.encodeStructure(descriptor) { - encodeSerializableElement(descriptor, 0, PolymorphicSerializer(ParamDecl::class), value.param) + encodeSerializableElement( + descriptor, + 0, + PolymorphicSerializer(ParamDecl::class), + value.param, + ) encodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class), value.result) } + override fun deserialize(decoder: Decoder): FuncLitExpr = decoder.decodeStructure(descriptor) { var param: ParamDecl? = null var result: Expr? = null while (true) { when (val i = decodeElementIndex(descriptor)) { - 0 -> param = decodeSerializableElement(descriptor, 0, PolymorphicSerializer(ParamDecl::class)) - 1 -> result = decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class)) + 0 -> + param = + decodeSerializableElement(descriptor, 0, PolymorphicSerializer(ParamDecl::class)) + 1 -> + result = decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class)) CompositeDecoder.DECODE_DONE -> break else -> throw SerializationException("Unknown index $i") } } FuncLitExpr( param ?: throw SerializationException("Missing param"), - result ?: throw SerializationException("Missing result") + result ?: throw SerializationException("Missing result"), ) } } diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/functype/FuncType.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/functype/FuncType.kt index 1d80bb94b5..2fa82fab55 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/functype/FuncType.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/functype/FuncType.kt @@ -51,34 +51,50 @@ data class FuncType( get() = throw UnsupportedOperationException() object Serializer : KSerializer> { - override val descriptor: SerialDescriptor = buildClassSerialDescriptor("FuncType") { - element("paramType") - element("resultType") - } + override val descriptor: SerialDescriptor = + buildClassSerialDescriptor("FuncType") { + element("paramType") + element("resultType") + } override fun serialize(encoder: Encoder, value: FuncType) = encoder.encodeStructure(descriptor) { - encodeSerializableElement(descriptor, 0, PolymorphicSerializer(Type::class), value.paramType) - encodeSerializableElement(descriptor, 1, PolymorphicSerializer(Type::class), value.resultType) + encodeSerializableElement( + descriptor, + 0, + PolymorphicSerializer(Type::class), + value.paramType, + ) + encodeSerializableElement( + descriptor, + 1, + PolymorphicSerializer(Type::class), + value.resultType, + ) } - override fun deserialize(decoder: Decoder): FuncType = decoder.decodeStructure(descriptor) { - var paramType: Type? = null - var resultType: Type? = null + override fun deserialize(decoder: Decoder): FuncType = + decoder.decodeStructure(descriptor) { + var paramType: Type? = null + var resultType: Type? = null - while (true) { - when (val index = decodeElementIndex(descriptor)) { - 0 -> paramType = decodeSerializableElement(descriptor, 0, PolymorphicSerializer(Type::class)) - 1 -> resultType = decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Type::class)) - CompositeDecoder.DECODE_DONE -> break - else -> error("Unexpected index: $index") + while (true) { + when (val index = decodeElementIndex(descriptor)) { + 0 -> + paramType = + decodeSerializableElement(descriptor, 0, PolymorphicSerializer(Type::class)) + 1 -> + resultType = + decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Type::class)) + CompositeDecoder.DECODE_DONE -> break + else -> error("Unexpected index: $index") + } } - } - FuncType( - paramType = paramType ?: error("Missing paramType"), - resultType = resultType ?: error("Missing resultType") - ) - } + FuncType( + paramType = paramType ?: error("Missing paramType"), + resultType = resultType ?: error("Missing resultType"), + ) + } } } diff --git a/subprojects/common/core/src/test/java/hu/bme/mit/theta/core/expr/EvaluationTest.java b/subprojects/common/core/src/test/java/hu/bme/mit/theta/core/expr/EvaluationTest.java index 7df3679af7..8bd1ba4794 100644 --- a/subprojects/common/core/src/test/java/hu/bme/mit/theta/core/expr/EvaluationTest.java +++ b/subprojects/common/core/src/test/java/hu/bme/mit/theta/core/expr/EvaluationTest.java @@ -15,19 +15,6 @@ */ package hu.bme.mit.theta.core.expr; -import hu.bme.mit.theta.core.decl.ConstDecl; -import hu.bme.mit.theta.core.decl.VarDecl; -import hu.bme.mit.theta.core.model.ImmutableValuation; -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.type.Type; -import hu.bme.mit.theta.core.type.inttype.IntType; -import kotlin.Pair; -import org.junit.Test; - -import java.util.ArrayList; - import static hu.bme.mit.theta.core.decl.Decls.Const; import static hu.bme.mit.theta.core.decl.Decls.Var; import static hu.bme.mit.theta.core.type.anytype.Exprs.Ite; @@ -59,6 +46,18 @@ import static hu.bme.mit.theta.core.type.rattype.RatExprs.Sub; import static org.junit.Assert.assertEquals; +import hu.bme.mit.theta.core.decl.ConstDecl; +import hu.bme.mit.theta.core.decl.VarDecl; +import hu.bme.mit.theta.core.model.ImmutableValuation; +import hu.bme.mit.theta.core.model.Valuation; +import hu.bme.mit.theta.core.type.Expr; +import hu.bme.mit.theta.core.type.LitExpr; +import hu.bme.mit.theta.core.type.Type; +import hu.bme.mit.theta.core.type.inttype.IntType; +import java.util.ArrayList; +import kotlin.Pair; +import org.junit.Test; + public class EvaluationTest { private final ConstDecl ca = Const("a", Int()); diff --git a/subprojects/common/core/src/test/java/hu/bme/mit/theta/core/utils/ExprCanonizerTest.java b/subprojects/common/core/src/test/java/hu/bme/mit/theta/core/utils/ExprCanonizerTest.java index e8a51a3274..3c28d3721a 100644 --- a/subprojects/common/core/src/test/java/hu/bme/mit/theta/core/utils/ExprCanonizerTest.java +++ b/subprojects/common/core/src/test/java/hu/bme/mit/theta/core/utils/ExprCanonizerTest.java @@ -15,23 +15,6 @@ */ package hu.bme.mit.theta.core.utils; -import hu.bme.mit.theta.core.decl.ConstDecl; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.booltype.BoolType; -import hu.bme.mit.theta.core.type.inttype.IntExprs; -import hu.bme.mit.theta.core.type.inttype.IntType; -import hu.bme.mit.theta.core.type.rattype.RatExprs; -import hu.bme.mit.theta.core.type.rattype.RatType; -import kotlin.Pair; -import org.junit.Test; -import org.junit.experimental.runners.Enclosed; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; - import static hu.bme.mit.theta.core.decl.Decls.Const; import static hu.bme.mit.theta.core.type.anytype.Exprs.Ite; import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.*; @@ -50,6 +33,22 @@ import static hu.bme.mit.theta.core.utils.ExprCanonizer.canonize; import static org.junit.Assert.assertEquals; +import hu.bme.mit.theta.core.decl.ConstDecl; +import hu.bme.mit.theta.core.type.Expr; +import hu.bme.mit.theta.core.type.booltype.BoolType; +import hu.bme.mit.theta.core.type.inttype.IntExprs; +import hu.bme.mit.theta.core.type.inttype.IntType; +import hu.bme.mit.theta.core.type.rattype.RatExprs; +import hu.bme.mit.theta.core.type.rattype.RatType; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import kotlin.Pair; +import org.junit.Test; +import org.junit.experimental.runners.Enclosed; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; + @RunWith(Enclosed.class) public class ExprCanonizerTest { diff --git a/subprojects/common/core/src/test/java/hu/bme/mit/theta/core/utils/ExprSimplifierTest.java b/subprojects/common/core/src/test/java/hu/bme/mit/theta/core/utils/ExprSimplifierTest.java index 3787f5f210..4309a2f479 100644 --- a/subprojects/common/core/src/test/java/hu/bme/mit/theta/core/utils/ExprSimplifierTest.java +++ b/subprojects/common/core/src/test/java/hu/bme/mit/theta/core/utils/ExprSimplifierTest.java @@ -15,26 +15,6 @@ */ package hu.bme.mit.theta.core.utils; -import hu.bme.mit.theta.core.decl.ConstDecl; -import hu.bme.mit.theta.core.decl.VarDecl; -import hu.bme.mit.theta.core.model.ImmutableValuation; -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.Expr; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.type.arraytype.ArrayInitExpr; -import hu.bme.mit.theta.core.type.arraytype.ArrayLitExpr; -import hu.bme.mit.theta.core.type.arraytype.ArrayReadExpr; -import hu.bme.mit.theta.core.type.booltype.BoolType; -import hu.bme.mit.theta.core.type.bvtype.BvExprs; -import hu.bme.mit.theta.core.type.bvtype.BvType; -import hu.bme.mit.theta.core.type.inttype.IntType; -import hu.bme.mit.theta.core.type.rattype.RatType; -import kotlin.Pair; -import org.junit.Test; - -import java.util.ArrayList; -import java.util.List; - import static hu.bme.mit.theta.core.decl.Decls.Const; import static hu.bme.mit.theta.core.decl.Decls.Var; import static hu.bme.mit.theta.core.type.anytype.Exprs.Ite; @@ -69,6 +49,25 @@ import static hu.bme.mit.theta.core.utils.ExprUtils.simplify; import static org.junit.Assert.*; +import hu.bme.mit.theta.core.decl.ConstDecl; +import hu.bme.mit.theta.core.decl.VarDecl; +import hu.bme.mit.theta.core.model.ImmutableValuation; +import hu.bme.mit.theta.core.model.Valuation; +import hu.bme.mit.theta.core.type.Expr; +import hu.bme.mit.theta.core.type.LitExpr; +import hu.bme.mit.theta.core.type.arraytype.ArrayInitExpr; +import hu.bme.mit.theta.core.type.arraytype.ArrayLitExpr; +import hu.bme.mit.theta.core.type.arraytype.ArrayReadExpr; +import hu.bme.mit.theta.core.type.booltype.BoolType; +import hu.bme.mit.theta.core.type.bvtype.BvExprs; +import hu.bme.mit.theta.core.type.bvtype.BvType; +import hu.bme.mit.theta.core.type.inttype.IntType; +import hu.bme.mit.theta.core.type.rattype.RatType; +import java.util.ArrayList; +import java.util.List; +import kotlin.Pair; +import org.junit.Test; + public class ExprSimplifierTest { private final ConstDecl cx = Const("x", Bool()); diff --git a/subprojects/common/core/src/test/kotlin/hu/bme/mit/theta/core/serialization/StmtSerializationTest.kt b/subprojects/common/core/src/test/kotlin/hu/bme/mit/theta/core/serialization/StmtSerializationTest.kt index a628f75192..b8a6f96a9b 100644 --- a/subprojects/common/core/src/test/kotlin/hu/bme/mit/theta/core/serialization/StmtSerializationTest.kt +++ b/subprojects/common/core/src/test/kotlin/hu/bme/mit/theta/core/serialization/StmtSerializationTest.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.serialization import hu.bme.mit.theta.core.decl.Decls @@ -27,113 +26,112 @@ import org.junit.jupiter.api.Test class StmtSerializationTest { - companion object { - - private val json = coreJson - } - - @Test - fun `test AssignStmt serialization`() { - val x = Decls.Var("x", Int()) - val original: Stmt = AssignStmt(x, Int(42)) - val serialized = json.encodeToString(original) - val deserialized = json.decodeFromString(serialized) - assertEquals(original, deserialized) - assertEquals("x", (deserialized as AssignStmt<*>).varDecl.name) - } - - @Test - fun `test AssumeStmt serialization`() { - val x = Decls.Var("x", Int()) - val cond = Eq(x.ref, Int(42)) - val original: Stmt = AssumeStmt(cond) - val serialized = json.encodeToString(original) - val deserialized = json.decodeFromString(serialized) - assertEquals(original, deserialized) - assertEquals("(= x 42)", (deserialized as AssumeStmt).cond.toString()) - } - - @Test - fun `test HavocStmt serialization`() { - val x = Decls.Var("x", Int()) - val original: Stmt = HavocStmt(x) - val serialized = json.encodeToString(original) - val deserialized = json.decodeFromString(serialized) - assertEquals(original, deserialized) - assertEquals("x", (deserialized as HavocStmt<*>).varDecl.name) - } - - @Test - fun `test IfStmt serialization`() { - val x = Decls.Var("x", Int()) - val cond = Eq(x.ref, Int(42)) - val thenStmt: Stmt = AssignStmt(x, Int(1)) - val elseStmt: Stmt = AssignStmt(x, Int(0)) - val original: Stmt = IfStmt(cond, thenStmt, elseStmt) - val serialized = json.encodeToString(original) - val deserialized = json.decodeFromString(serialized) - assertEquals(original, deserialized) - } - - @Test - fun `test LoopStmt serialization`() { - val i = Decls.Var("i", Int()) - val x = Decls.Var("x", Int()) - val stmt: Stmt = AssignStmt(x, Int(1)) - val original: Stmt = LoopStmt(stmt, i, Int(0), Int(42)) - val serialized = json.encodeToString(original) - val deserialized = json.decodeFromString(serialized) - assertEquals(original, deserialized) - } - - @Test - fun `test MemoryAssignStmt serialization`() { - val dereference = Dereference(Decls.Var("ptr", Int()).ref, Int(0), Int()) - val original: Stmt = MemoryAssignStmt(dereference, Int(42)) - val serialized = json.encodeToString(original) - val deserialized = json.decodeFromString(serialized) - assertEquals(original, deserialized) - } - - @Test - fun `test NonDetStmt serialization`() { - val s1 = AssignStmt(Decls.Var("x", Int()), Int(1)) - val s2 = AssignStmt(Decls.Var("y", Int()), Int(2)) - val s3 = SkipStmt - val original: Stmt = NonDetStmt(listOf(s1, s2, s3)) - val serialized = json.encodeToString(original) - val deserialized = json.decodeFromString(serialized) - assertEquals(original, deserialized) - } - - @Test - fun `test OrtStmt serialization`() { - val s1 = AssignStmt(Decls.Var("x", Int()), Int(1)) - val s2 = AssignStmt(Decls.Var("y", Int()), Int(2)) - val s3 = SkipStmt - val original: Stmt = OrtStmt(listOf(s1, s2, s3)) - val serialized = json.encodeToString(original) - val deserialized = json.decodeFromString(serialized) - assertEquals(original, deserialized) - } - - @Test - fun `test SequenceStmt serialization`() { - val s1 = AssignStmt(Decls.Var("x", Int()), Int(1)) - val s2 = AssignStmt(Decls.Var("y", Int()), Int(2)) - val s3 = SkipStmt - val original: Stmt = SequenceStmt(listOf(s1, s2, s3)) - val serialized = json.encodeToString(original) - val deserialized = json.decodeFromString(serialized) - assertEquals(original, deserialized) - } - - @Test - fun `test SkipStmt serialization`() { - val original: Stmt = SkipStmt - val serialized = json.encodeToString(original) - val deserialized = json.decodeFromString(serialized) - assertEquals(original, deserialized) - } + companion object { + + private val json = coreJson + } + + @Test + fun `test AssignStmt serialization`() { + val x = Decls.Var("x", Int()) + val original: Stmt = AssignStmt(x, Int(42)) + val serialized = json.encodeToString(original) + val deserialized = json.decodeFromString(serialized) + assertEquals(original, deserialized) + assertEquals("x", (deserialized as AssignStmt<*>).varDecl.name) + } + + @Test + fun `test AssumeStmt serialization`() { + val x = Decls.Var("x", Int()) + val cond = Eq(x.ref, Int(42)) + val original: Stmt = AssumeStmt(cond) + val serialized = json.encodeToString(original) + val deserialized = json.decodeFromString(serialized) + assertEquals(original, deserialized) + assertEquals("(= x 42)", (deserialized as AssumeStmt).cond.toString()) + } + + @Test + fun `test HavocStmt serialization`() { + val x = Decls.Var("x", Int()) + val original: Stmt = HavocStmt(x) + val serialized = json.encodeToString(original) + val deserialized = json.decodeFromString(serialized) + assertEquals(original, deserialized) + assertEquals("x", (deserialized as HavocStmt<*>).varDecl.name) + } + + @Test + fun `test IfStmt serialization`() { + val x = Decls.Var("x", Int()) + val cond = Eq(x.ref, Int(42)) + val thenStmt: Stmt = AssignStmt(x, Int(1)) + val elseStmt: Stmt = AssignStmt(x, Int(0)) + val original: Stmt = IfStmt(cond, thenStmt, elseStmt) + val serialized = json.encodeToString(original) + val deserialized = json.decodeFromString(serialized) + assertEquals(original, deserialized) + } + + @Test + fun `test LoopStmt serialization`() { + val i = Decls.Var("i", Int()) + val x = Decls.Var("x", Int()) + val stmt: Stmt = AssignStmt(x, Int(1)) + val original: Stmt = LoopStmt(stmt, i, Int(0), Int(42)) + val serialized = json.encodeToString(original) + val deserialized = json.decodeFromString(serialized) + assertEquals(original, deserialized) + } + + @Test + fun `test MemoryAssignStmt serialization`() { + val dereference = Dereference(Decls.Var("ptr", Int()).ref, Int(0), Int()) + val original: Stmt = MemoryAssignStmt(dereference, Int(42)) + val serialized = json.encodeToString(original) + val deserialized = json.decodeFromString(serialized) + assertEquals(original, deserialized) + } + + @Test + fun `test NonDetStmt serialization`() { + val s1 = AssignStmt(Decls.Var("x", Int()), Int(1)) + val s2 = AssignStmt(Decls.Var("y", Int()), Int(2)) + val s3 = SkipStmt + val original: Stmt = NonDetStmt(listOf(s1, s2, s3)) + val serialized = json.encodeToString(original) + val deserialized = json.decodeFromString(serialized) + assertEquals(original, deserialized) + } + + @Test + fun `test OrtStmt serialization`() { + val s1 = AssignStmt(Decls.Var("x", Int()), Int(1)) + val s2 = AssignStmt(Decls.Var("y", Int()), Int(2)) + val s3 = SkipStmt + val original: Stmt = OrtStmt(listOf(s1, s2, s3)) + val serialized = json.encodeToString(original) + val deserialized = json.decodeFromString(serialized) + assertEquals(original, deserialized) + } + + @Test + fun `test SequenceStmt serialization`() { + val s1 = AssignStmt(Decls.Var("x", Int()), Int(1)) + val s2 = AssignStmt(Decls.Var("y", Int()), Int(2)) + val s3 = SkipStmt + val original: Stmt = SequenceStmt(listOf(s1, s2, s3)) + val serialized = json.encodeToString(original) + val deserialized = json.decodeFromString(serialized) + assertEquals(original, deserialized) + } + + @Test + fun `test SkipStmt serialization`() { + val original: Stmt = SkipStmt + val serialized = json.encodeToString(original) + val deserialized = json.decodeFromString(serialized) + assertEquals(original, deserialized) + } } - diff --git a/subprojects/common/core/src/test/kotlin/hu/bme/mit/theta/core/serialization/TypeSerializationTest.kt b/subprojects/common/core/src/test/kotlin/hu/bme/mit/theta/core/serialization/TypeSerializationTest.kt index ff183eec02..d83c2b61e5 100644 --- a/subprojects/common/core/src/test/kotlin/hu/bme/mit/theta/core/serialization/TypeSerializationTest.kt +++ b/subprojects/common/core/src/test/kotlin/hu/bme/mit/theta/core/serialization/TypeSerializationTest.kt @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package hu.bme.mit.theta.core.serialization import hu.bme.mit.theta.core.type.Type @@ -38,137 +37,127 @@ import org.junit.jupiter.params.provider.MethodSource class TypeSerializationTest { - companion object { - - private val json = coreJson - - @JvmStatic - val bvTypeTestData: List = listOf( - Arguments.of(42, true), - Arguments.of(1, false), - Arguments.of(8, null), - ) + companion object { + + private val json = coreJson + + @JvmStatic + val bvTypeTestData: List = + listOf(Arguments.of(42, true), Arguments.of(1, false), Arguments.of(8, null)) + } + + @Test + fun `test BoolType serialization`() { + val original: Type = BoolType + val serialized = json.encodeToString(original) + val deserialized = json.decodeFromString(serialized) + assertEquals(original, deserialized) + } + + @Test + fun `test IntType serialization`() { + val original: Type = IntType + val serialized = json.encodeToString(original) + val deserialized = json.decodeFromString(serialized) + assertEquals(original, deserialized) + } + + @ParameterizedTest + @MethodSource("getBvTypeTestData") + fun `test BvType serialization`(size: Int, signed: Boolean?) { + val original: Type = BvType(size, signed) + val serialized = json.encodeToString(original) + val deserialized = json.decodeFromString(serialized) + assertEquals(original, deserialized) + val deserializedBvType = deserialized as BvType + assertEquals(size, deserializedBvType.size) + } + + @Test + fun `test ArrayType serialization`() { + val original: Type = ArrayType(BoolType, IntType) + val serialized = json.encodeToString(original) + val deserialized = json.decodeFromString(serialized) + assertEquals(original, deserialized) + + val complex: Type = + ArrayType( + indexType = BvType(8, false), + elemType = ArrayType(indexType = ArrayType(IntType, RatType), elemType = BoolType), + ) + val complexSerialized = json.encodeToString(complex) + val complexDeserialized = json.decodeFromString(complexSerialized) + assertEquals(complex, complexDeserialized) + assertDoesNotThrow { + complexDeserialized as ArrayType, BoolType>> } - - @Test - fun `test BoolType serialization`() { - val original: Type = BoolType - val serialized = json.encodeToString(original) - val deserialized = json.decodeFromString(serialized) - assertEquals(original, deserialized) - } - - @Test - fun `test IntType serialization`() { - val original: Type = IntType - val serialized = json.encodeToString(original) - val deserialized = json.decodeFromString(serialized) - assertEquals(original, deserialized) + assertThrows { + (complexDeserialized as ArrayType).elemType.size } - - @ParameterizedTest - @MethodSource("getBvTypeTestData") - fun `test BvType serialization`(size: Int, signed: Boolean?) { - val original: Type = BvType(size, signed) - val serialized = json.encodeToString(original) - val deserialized = json.decodeFromString(serialized) - assertEquals(original, deserialized) - val deserializedBvType = deserialized as BvType - assertEquals(size, deserializedBvType.size) - } - - @Test - fun `test ArrayType serialization`() { - val original: Type = ArrayType(BoolType, IntType) - val serialized = json.encodeToString(original) - val deserialized = json.decodeFromString(serialized) - assertEquals(original, deserialized) - - val complex: Type = ArrayType( - indexType = BvType(8, false), - elemType = ArrayType( - indexType = ArrayType(IntType, RatType), - elemType = BoolType, - ) - ) - val complexSerialized = json.encodeToString(complex) - val complexDeserialized = json.decodeFromString(complexSerialized) - assertEquals(complex, complexDeserialized) - assertDoesNotThrow { - complexDeserialized as ArrayType, BoolType>> - } - assertThrows { - (complexDeserialized as ArrayType).elemType.size - } - } - - @Test - fun `test FuncType serialization`() { - val original: Type = FuncType(IntType, BoolType) - val serialized = json.encodeToString(original) - val deserialized = json.decodeFromString(serialized) - assertEquals(original, deserialized) - } - - @Test - fun `test FpType serialization`() { - val original: Type = FpType(8, 24) - val serialized = json.encodeToString(original) - val deserialized = json.decodeFromString(serialized) - assertEquals(original, deserialized) - } - - @Test - fun `test RatType serialization`() { - val original: Type = RatType - val serialized = json.encodeToString(original) - val deserialized = json.decodeFromString(serialized) - assertEquals(original, deserialized) - } - - @Test - fun `test EnumType serialization`() { - val original: Type = EnumType.of("Color", listOf("Red", "Green", "Blue")) - val serialized = json.encodeToString(original) - val deserialized = json.decodeFromString(serialized) - assertEquals(original, deserialized) - } - - @Test - fun `test heterogeneous Type collection serialization`() { - val original: List = listOf( - BoolType, - IntType, - BvType(8, true), - ArrayType(BoolType, IntType), - FuncType(IntType, BoolType), - FpType(8, 24), - RatType, - EnumType.of("Color", listOf("Red", "Green", "Blue")) - ) - val serialized = json.encodeToString(original) - val deserialized = json.decodeFromString>(serialized) - assertEquals(original, deserialized) - } - - @Test - fun `test specific serializer must ignore type field`() { - val original: Type = BvType(8, true) - val serialized = json.encodeToString(original) - assertDoesNotThrow { - (json.decodeFromString(serialized) as BvType).size - } - assertThrows { - json.decodeFromString(serialized).size - } - - val jsonIgnoreUnknownKey = Json { - serializersModule = coreSerializerModule - classDiscriminator = "class" - ignoreUnknownKeys = true - } - assertDoesNotThrow { - jsonIgnoreUnknownKey.decodeFromString(serialized).size - } + } + + @Test + fun `test FuncType serialization`() { + val original: Type = FuncType(IntType, BoolType) + val serialized = json.encodeToString(original) + val deserialized = json.decodeFromString(serialized) + assertEquals(original, deserialized) + } + + @Test + fun `test FpType serialization`() { + val original: Type = FpType(8, 24) + val serialized = json.encodeToString(original) + val deserialized = json.decodeFromString(serialized) + assertEquals(original, deserialized) + } + + @Test + fun `test RatType serialization`() { + val original: Type = RatType + val serialized = json.encodeToString(original) + val deserialized = json.decodeFromString(serialized) + assertEquals(original, deserialized) + } + + @Test + fun `test EnumType serialization`() { + val original: Type = EnumType.of("Color", listOf("Red", "Green", "Blue")) + val serialized = json.encodeToString(original) + val deserialized = json.decodeFromString(serialized) + assertEquals(original, deserialized) + } + + @Test + fun `test heterogeneous Type collection serialization`() { + val original: List = + listOf( + BoolType, + IntType, + BvType(8, true), + ArrayType(BoolType, IntType), + FuncType(IntType, BoolType), + FpType(8, 24), + RatType, + EnumType.of("Color", listOf("Red", "Green", "Blue")), + ) + val serialized = json.encodeToString(original) + val deserialized = json.decodeFromString>(serialized) + assertEquals(original, deserialized) + } + + @Test + fun `test specific serializer must ignore type field`() { + val original: Type = BvType(8, true) + val serialized = json.encodeToString(original) + assertDoesNotThrow { (json.decodeFromString(serialized) as BvType).size } + assertThrows { json.decodeFromString(serialized).size } + + val jsonIgnoreUnknownKey = Json { + serializersModule = coreSerializerModule + classDiscriminator = "class" + ignoreUnknownKeys = true } + assertDoesNotThrow { jsonIgnoreUnknownKey.decodeFromString(serialized).size } + } } diff --git a/subprojects/common/ksp-processor/src/main/kotlin/hu/bme/mit/theta/ksp/PolymorphicModuleProcessor.kt b/subprojects/common/ksp-processor/src/main/kotlin/hu/bme/mit/theta/ksp/PolymorphicModuleProcessor.kt index 7236f84803..6de1f667c5 100644 --- a/subprojects/common/ksp-processor/src/main/kotlin/hu/bme/mit/theta/ksp/PolymorphicModuleProcessor.kt +++ b/subprojects/common/ksp-processor/src/main/kotlin/hu/bme/mit/theta/ksp/PolymorphicModuleProcessor.kt @@ -1,3 +1,18 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package hu.bme.mit.theta.ksp import com.google.devtools.ksp.getAllSuperTypes diff --git a/subprojects/common/ksp-processor/src/main/kotlin/hu/bme/mit/theta/ksp/PolymorphicModuleProcessorProvider.kt b/subprojects/common/ksp-processor/src/main/kotlin/hu/bme/mit/theta/ksp/PolymorphicModuleProcessorProvider.kt index f2d5f2d609..77a50be713 100644 --- a/subprojects/common/ksp-processor/src/main/kotlin/hu/bme/mit/theta/ksp/PolymorphicModuleProcessorProvider.kt +++ b/subprojects/common/ksp-processor/src/main/kotlin/hu/bme/mit/theta/ksp/PolymorphicModuleProcessorProvider.kt @@ -1,3 +1,18 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package hu.bme.mit.theta.ksp import com.google.devtools.ksp.processing.* From 4f3b132fc98bd2149423c08853b834a248ac0dcb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Csan=C3=A1d=20Telbisz?= Date: Thu, 26 Jun 2025 14:42:43 +0200 Subject: [PATCH 31/48] minor fixes --- .../bme/mit/theta/core/type/bvtype/BvType.kt | 154 ++++++++++-------- .../mit/theta/core/type/rattype/RatAddExpr.kt | 4 +- .../mit/theta/core/type/rattype/RatExprs.kt | 18 +- .../mit/theta/core/type/rattype/RatLitExpr.kt | 3 + 4 files changed, 97 insertions(+), 82 deletions(-) diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvType.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvType.kt index 6e85555743..bddd64b5b6 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvType.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvType.kt @@ -23,96 +23,108 @@ import hu.bme.mit.theta.core.type.abstracttype.* import hu.bme.mit.theta.core.type.fptype.FpExprs.FromBv import hu.bme.mit.theta.core.type.fptype.FpRoundingMode.Companion.defaultRoundingMode import hu.bme.mit.theta.core.type.fptype.FpType -import java.math.BigInteger import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable +import java.math.BigInteger + @Serializable @SerialName(BvType.TYPE_LABEL) data class BvType(val size: Int, val signed: Boolean?) : - Additive, - Multiplicative, - Divisible, - Equational, - Ordered, - Castable { + Additive, + Multiplicative, + Divisible, + Equational, + Ordered, + Castable { + + init { + require(size > 0) { "Bitvector size must be positive" } + } + + companion object { + + internal const val TYPE_LABEL = "Bv" + + @JvmStatic + fun of(size: Int): BvType = BvType(size, null) + + @JvmStatic + fun of(size: Int, signed: Boolean?): BvType = BvType(size, signed) + } + + fun withSize(size: Int): BvType = BvType(size, signed) + + fun isSigned(): Boolean = signed ?: error("Signedness is not specified") + + override fun Eq(leftOp: Expr, rightOp: Expr) = BvEqExpr(leftOp, rightOp) - init { - require(size > 0) { "Bitvector size must be positive" } - } + override fun Neq(leftOp: Expr, rightOp: Expr) = BvNeqExpr(leftOp, rightOp) - companion object { + override fun Add(ops: Iterable>) = BvExprs.Add(ops) - internal const val TYPE_LABEL = "Bv" + override fun Sub(leftOp: Expr, rightOp: Expr) = BvExprs.Sub(leftOp, rightOp) - @JvmStatic fun of(size: Int): BvType = BvType(size, null) + override fun Pos(op: Expr) = BvExprs.Pos(op) - @JvmStatic fun of(size: Int, signed: Boolean?): BvType = BvType(size, signed) - } + override fun Neg(op: Expr) = BvExprs.Neg(op) - fun withSize(size: Int): BvType = BvType(size, signed) + override fun Cast(op: Expr, type: TargetType): Expr { + if (type is FpType && signed != null) { + @Suppress("UNCHECKED_CAST") + return FromBv(defaultRoundingMode, op, type as FpType, signed) as Expr + } + throw ClassCastException("Bv cannot be cast to $type") + } + + override fun Mod(leftOp: Expr, rightOp: Expr): ModExpr { + check(signed != null && signed) { "Signed BvType required for Mod" } + return BvExprs.SMod(leftOp, rightOp) + } + + override fun Rem(leftOp: Expr, rightOp: Expr): RemExpr { + check(signed != null) { "Neutral BvType cannot be used here" } + return if (signed) BvExprs.SRem(leftOp, rightOp) else BvExprs.URem(leftOp, rightOp) + } + + override fun Mul(ops: Iterable>) = BvExprs.Mul(ops) - fun isSigned(): Boolean = signed ?: error("Signedness is not specified") + override fun Div(leftOp: Expr, rightOp: Expr): DivExpr { + check(signed != null) { "Neutral BvType cannot be used here" } + return if (signed) BvExprs.SDiv(leftOp, rightOp) else BvExprs.UDiv(leftOp, rightOp) + } - override fun Eq(leftOp: Expr, rightOp: Expr) = BvEqExpr(leftOp, rightOp) + override fun Lt(leftOp: Expr, rightOp: Expr): LtExpr { + check(signed != null) { "Neutral BvType cannot be used here" } + return if (signed) BvExprs.SLt(leftOp, rightOp) else BvExprs.ULt(leftOp, rightOp) + } - override fun Neq(leftOp: Expr, rightOp: Expr) = BvNeqExpr(leftOp, rightOp) + override fun Leq(leftOp: Expr, rightOp: Expr): LeqExpr { + check(signed != null) { "Neutral BvType cannot be used here" } + return if (signed) BvExprs.SLeq(leftOp, rightOp) else BvExprs.ULeq(leftOp, rightOp) + } - override fun Add(ops: Iterable>) = BvExprs.Add(ops) + override fun Gt(leftOp: Expr, rightOp: Expr): GtExpr { + check(signed != null) { "Neutral BvType cannot be used here" } + return if (signed) BvExprs.SGt(leftOp, rightOp) else BvExprs.UGt(leftOp, rightOp) + } - override fun Sub(leftOp: Expr, rightOp: Expr) = BvExprs.Sub(leftOp, rightOp) + override fun Geq(leftOp: Expr, rightOp: Expr): GeqExpr { + check(signed != null) { "Neutral BvType cannot be used here" } + return if (signed) BvExprs.SGeq(leftOp, rightOp) else BvExprs.UGeq(leftOp, rightOp) + } - override fun Pos(op: Expr) = BvExprs.Pos(op) + override val domainSize: DomainSize + get() = DomainSize.of(BigInteger.TWO.pow(size)) - override fun Neg(op: Expr) = BvExprs.Neg(op) + override fun toString(): String = Utils.lispStringBuilder(TYPE_LABEL).add(size).toString() - override fun Cast(op: Expr, type: TargetType): Expr { - if (type is FpType && signed != null) { - @Suppress("UNCHECKED_CAST") - return FromBv(defaultRoundingMode, op, type as FpType, signed) as Expr + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (other !is BvType) return false + if (size != other.size) return false + return true } - throw ClassCastException("Bv cannot be cast to $type") - } - - override fun Mod(leftOp: Expr, rightOp: Expr): ModExpr { - check(signed != null && signed) { "Signed BvType required for Mod" } - return BvExprs.SMod(leftOp, rightOp) - } - - override fun Rem(leftOp: Expr, rightOp: Expr): RemExpr { - check(signed != null) { "Neutral BvType cannot be used here" } - return if (signed) BvExprs.SRem(leftOp, rightOp) else BvExprs.URem(leftOp, rightOp) - } - - override fun Mul(ops: Iterable>) = BvExprs.Mul(ops) - - override fun Div(leftOp: Expr, rightOp: Expr): DivExpr { - check(signed != null) { "Neutral BvType cannot be used here" } - return if (signed) BvExprs.SDiv(leftOp, rightOp) else BvExprs.UDiv(leftOp, rightOp) - } - - override fun Lt(leftOp: Expr, rightOp: Expr): LtExpr { - check(signed != null) { "Neutral BvType cannot be used here" } - return if (signed) BvExprs.SLt(leftOp, rightOp) else BvExprs.ULt(leftOp, rightOp) - } - - override fun Leq(leftOp: Expr, rightOp: Expr): LeqExpr { - check(signed != null) { "Neutral BvType cannot be used here" } - return if (signed) BvExprs.SLeq(leftOp, rightOp) else BvExprs.ULeq(leftOp, rightOp) - } - - override fun Gt(leftOp: Expr, rightOp: Expr): GtExpr { - check(signed != null) { "Neutral BvType cannot be used here" } - return if (signed) BvExprs.SGt(leftOp, rightOp) else BvExprs.UGt(leftOp, rightOp) - } - - override fun Geq(leftOp: Expr, rightOp: Expr): GeqExpr { - check(signed != null) { "Neutral BvType cannot be used here" } - return if (signed) BvExprs.SGeq(leftOp, rightOp) else BvExprs.UGeq(leftOp, rightOp) - } - - override val domainSize: DomainSize - get() = DomainSize.of(BigInteger.TWO.pow(size)) - - override fun toString(): String = Utils.lispStringBuilder(TYPE_LABEL).add(size).toString() + + override fun hashCode(): Int = size.hashCode() } diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatAddExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatAddExpr.kt index 52cf17b079..54427d9548 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatAddExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatAddExpr.kt @@ -25,7 +25,7 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("RatAdd") -class RatAddExpr(override val ops: List>) : AddExpr() { +data class RatAddExpr(override val ops: List>) : AddExpr() { companion object { @@ -55,7 +55,7 @@ class RatAddExpr(override val ops: List>) : AddExpr() { return Rat(sumNum, sumDenom) } - override fun new(ops: List>): RatAddExpr = new(ops) + override fun new(ops: List>): RatAddExpr = of(ops) override val operatorLabel: String = OPERATOR_LABEL diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatExprs.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatExprs.kt index 8377ab4ebe..efac51693b 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatExprs.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatExprs.kt @@ -25,27 +25,27 @@ object RatExprs { @JvmStatic fun Rat(num: Int, denom: Int) = - RatLitExpr(BigInteger.valueOf(num.toLong()), BigInteger.valueOf(denom.toLong())) + RatLitExpr.of(BigInteger.valueOf(num.toLong()), BigInteger.valueOf(denom.toLong())) @JvmStatic - fun Rat(num: Int, denom: String) = RatLitExpr(BigInteger.valueOf(num.toLong()), BigInteger(denom)) + fun Rat(num: Int, denom: String) = RatLitExpr.of(BigInteger.valueOf(num.toLong()), BigInteger(denom)) @JvmStatic - fun Rat(num: Int, denom: BigInteger) = RatLitExpr(BigInteger.valueOf(num.toLong()), denom) + fun Rat(num: Int, denom: BigInteger) = RatLitExpr.of(BigInteger.valueOf(num.toLong()), denom) @JvmStatic - fun Rat(num: String, denom: Int) = RatLitExpr(BigInteger(num), BigInteger.valueOf(denom.toLong())) + fun Rat(num: String, denom: Int) = RatLitExpr.of(BigInteger(num), BigInteger.valueOf(denom.toLong())) - @JvmStatic fun Rat(num: String, denom: String) = RatLitExpr(BigInteger(num), BigInteger(denom)) + @JvmStatic fun Rat(num: String, denom: String) = RatLitExpr.of(BigInteger(num), BigInteger(denom)) - @JvmStatic fun Rat(num: String, denom: BigInteger) = RatLitExpr(BigInteger(num), denom) + @JvmStatic fun Rat(num: String, denom: BigInteger) = RatLitExpr.of(BigInteger(num), denom) @JvmStatic - fun Rat(num: BigInteger, denom: Int) = RatLitExpr(num, BigInteger.valueOf(denom.toLong())) + fun Rat(num: BigInteger, denom: Int) = RatLitExpr.of(num, BigInteger.valueOf(denom.toLong())) - @JvmStatic fun Rat(num: BigInteger, denom: String) = RatLitExpr(num, BigInteger(denom)) + @JvmStatic fun Rat(num: BigInteger, denom: String) = RatLitExpr.of(num, BigInteger(denom)) - @JvmStatic fun Rat(num: BigInteger, denom: BigInteger) = RatLitExpr(num, denom) + @JvmStatic fun Rat(num: BigInteger, denom: BigInteger) = RatLitExpr.of(num, denom) @JvmStatic fun Add(ops: Iterable>) = RatAddExpr.of(ops) diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatLitExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatLitExpr.kt index af30434e1e..74a3c5ee2c 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatLitExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatLitExpr.kt @@ -35,6 +35,9 @@ data class RatLitExpr( init { require(denom != BigInteger.ZERO) + require(num.abs().gcd(denom.abs()) == BigInteger.ONE) { + "Numerator and denominator must be coprime. Use the factory method RatLitExpr.of() to ensure this." + } } companion object { From 2fa6223c135ece6f00405d09e1fe429b8be87dce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Csan=C3=A1d=20Telbisz?= Date: Thu, 26 Jun 2025 14:43:54 +0200 Subject: [PATCH 32/48] formatting --- .../bme/mit/theta/core/type/bvtype/BvType.kt | 163 +++++++++--------- .../mit/theta/core/type/rattype/RatExprs.kt | 6 +- 2 files changed, 84 insertions(+), 85 deletions(-) diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvType.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvType.kt index bddd64b5b6..1e720d8e14 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvType.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvType.kt @@ -23,108 +23,105 @@ import hu.bme.mit.theta.core.type.abstracttype.* import hu.bme.mit.theta.core.type.fptype.FpExprs.FromBv import hu.bme.mit.theta.core.type.fptype.FpRoundingMode.Companion.defaultRoundingMode import hu.bme.mit.theta.core.type.fptype.FpType +import java.math.BigInteger import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import java.math.BigInteger - @Serializable @SerialName(BvType.TYPE_LABEL) data class BvType(val size: Int, val signed: Boolean?) : - Additive, - Multiplicative, - Divisible, - Equational, - Ordered, - Castable { - - init { - require(size > 0) { "Bitvector size must be positive" } - } - - companion object { - - internal const val TYPE_LABEL = "Bv" - - @JvmStatic - fun of(size: Int): BvType = BvType(size, null) - - @JvmStatic - fun of(size: Int, signed: Boolean?): BvType = BvType(size, signed) - } - - fun withSize(size: Int): BvType = BvType(size, signed) - - fun isSigned(): Boolean = signed ?: error("Signedness is not specified") - - override fun Eq(leftOp: Expr, rightOp: Expr) = BvEqExpr(leftOp, rightOp) + Additive, + Multiplicative, + Divisible, + Equational, + Ordered, + Castable { - override fun Neq(leftOp: Expr, rightOp: Expr) = BvNeqExpr(leftOp, rightOp) + init { + require(size > 0) { "Bitvector size must be positive" } + } - override fun Add(ops: Iterable>) = BvExprs.Add(ops) + companion object { - override fun Sub(leftOp: Expr, rightOp: Expr) = BvExprs.Sub(leftOp, rightOp) + internal const val TYPE_LABEL = "Bv" - override fun Pos(op: Expr) = BvExprs.Pos(op) + @JvmStatic fun of(size: Int): BvType = BvType(size, null) - override fun Neg(op: Expr) = BvExprs.Neg(op) + @JvmStatic fun of(size: Int, signed: Boolean?): BvType = BvType(size, signed) + } - override fun Cast(op: Expr, type: TargetType): Expr { - if (type is FpType && signed != null) { - @Suppress("UNCHECKED_CAST") - return FromBv(defaultRoundingMode, op, type as FpType, signed) as Expr - } - throw ClassCastException("Bv cannot be cast to $type") - } - - override fun Mod(leftOp: Expr, rightOp: Expr): ModExpr { - check(signed != null && signed) { "Signed BvType required for Mod" } - return BvExprs.SMod(leftOp, rightOp) - } - - override fun Rem(leftOp: Expr, rightOp: Expr): RemExpr { - check(signed != null) { "Neutral BvType cannot be used here" } - return if (signed) BvExprs.SRem(leftOp, rightOp) else BvExprs.URem(leftOp, rightOp) - } - - override fun Mul(ops: Iterable>) = BvExprs.Mul(ops) + fun withSize(size: Int): BvType = BvType(size, signed) - override fun Div(leftOp: Expr, rightOp: Expr): DivExpr { - check(signed != null) { "Neutral BvType cannot be used here" } - return if (signed) BvExprs.SDiv(leftOp, rightOp) else BvExprs.UDiv(leftOp, rightOp) - } + fun isSigned(): Boolean = signed ?: error("Signedness is not specified") - override fun Lt(leftOp: Expr, rightOp: Expr): LtExpr { - check(signed != null) { "Neutral BvType cannot be used here" } - return if (signed) BvExprs.SLt(leftOp, rightOp) else BvExprs.ULt(leftOp, rightOp) - } + override fun Eq(leftOp: Expr, rightOp: Expr) = BvEqExpr(leftOp, rightOp) - override fun Leq(leftOp: Expr, rightOp: Expr): LeqExpr { - check(signed != null) { "Neutral BvType cannot be used here" } - return if (signed) BvExprs.SLeq(leftOp, rightOp) else BvExprs.ULeq(leftOp, rightOp) - } + override fun Neq(leftOp: Expr, rightOp: Expr) = BvNeqExpr(leftOp, rightOp) - override fun Gt(leftOp: Expr, rightOp: Expr): GtExpr { - check(signed != null) { "Neutral BvType cannot be used here" } - return if (signed) BvExprs.SGt(leftOp, rightOp) else BvExprs.UGt(leftOp, rightOp) - } + override fun Add(ops: Iterable>) = BvExprs.Add(ops) - override fun Geq(leftOp: Expr, rightOp: Expr): GeqExpr { - check(signed != null) { "Neutral BvType cannot be used here" } - return if (signed) BvExprs.SGeq(leftOp, rightOp) else BvExprs.UGeq(leftOp, rightOp) - } + override fun Sub(leftOp: Expr, rightOp: Expr) = BvExprs.Sub(leftOp, rightOp) - override val domainSize: DomainSize - get() = DomainSize.of(BigInteger.TWO.pow(size)) + override fun Pos(op: Expr) = BvExprs.Pos(op) - override fun toString(): String = Utils.lispStringBuilder(TYPE_LABEL).add(size).toString() + override fun Neg(op: Expr) = BvExprs.Neg(op) - override fun equals(other: Any?): Boolean { - if (this === other) return true - if (other !is BvType) return false - if (size != other.size) return false - return true + override fun Cast(op: Expr, type: TargetType): Expr { + if (type is FpType && signed != null) { + @Suppress("UNCHECKED_CAST") + return FromBv(defaultRoundingMode, op, type as FpType, signed) as Expr } - - override fun hashCode(): Int = size.hashCode() + throw ClassCastException("Bv cannot be cast to $type") + } + + override fun Mod(leftOp: Expr, rightOp: Expr): ModExpr { + check(signed != null && signed) { "Signed BvType required for Mod" } + return BvExprs.SMod(leftOp, rightOp) + } + + override fun Rem(leftOp: Expr, rightOp: Expr): RemExpr { + check(signed != null) { "Neutral BvType cannot be used here" } + return if (signed) BvExprs.SRem(leftOp, rightOp) else BvExprs.URem(leftOp, rightOp) + } + + override fun Mul(ops: Iterable>) = BvExprs.Mul(ops) + + override fun Div(leftOp: Expr, rightOp: Expr): DivExpr { + check(signed != null) { "Neutral BvType cannot be used here" } + return if (signed) BvExprs.SDiv(leftOp, rightOp) else BvExprs.UDiv(leftOp, rightOp) + } + + override fun Lt(leftOp: Expr, rightOp: Expr): LtExpr { + check(signed != null) { "Neutral BvType cannot be used here" } + return if (signed) BvExprs.SLt(leftOp, rightOp) else BvExprs.ULt(leftOp, rightOp) + } + + override fun Leq(leftOp: Expr, rightOp: Expr): LeqExpr { + check(signed != null) { "Neutral BvType cannot be used here" } + return if (signed) BvExprs.SLeq(leftOp, rightOp) else BvExprs.ULeq(leftOp, rightOp) + } + + override fun Gt(leftOp: Expr, rightOp: Expr): GtExpr { + check(signed != null) { "Neutral BvType cannot be used here" } + return if (signed) BvExprs.SGt(leftOp, rightOp) else BvExprs.UGt(leftOp, rightOp) + } + + override fun Geq(leftOp: Expr, rightOp: Expr): GeqExpr { + check(signed != null) { "Neutral BvType cannot be used here" } + return if (signed) BvExprs.SGeq(leftOp, rightOp) else BvExprs.UGeq(leftOp, rightOp) + } + + override val domainSize: DomainSize + get() = DomainSize.of(BigInteger.TWO.pow(size)) + + override fun toString(): String = Utils.lispStringBuilder(TYPE_LABEL).add(size).toString() + + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (other !is BvType) return false + if (size != other.size) return false + return true + } + + override fun hashCode(): Int = size.hashCode() } diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatExprs.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatExprs.kt index efac51693b..22f8922585 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatExprs.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/rattype/RatExprs.kt @@ -28,13 +28,15 @@ object RatExprs { RatLitExpr.of(BigInteger.valueOf(num.toLong()), BigInteger.valueOf(denom.toLong())) @JvmStatic - fun Rat(num: Int, denom: String) = RatLitExpr.of(BigInteger.valueOf(num.toLong()), BigInteger(denom)) + fun Rat(num: Int, denom: String) = + RatLitExpr.of(BigInteger.valueOf(num.toLong()), BigInteger(denom)) @JvmStatic fun Rat(num: Int, denom: BigInteger) = RatLitExpr.of(BigInteger.valueOf(num.toLong()), denom) @JvmStatic - fun Rat(num: String, denom: Int) = RatLitExpr.of(BigInteger(num), BigInteger.valueOf(denom.toLong())) + fun Rat(num: String, denom: Int) = + RatLitExpr.of(BigInteger(num), BigInteger.valueOf(denom.toLong())) @JvmStatic fun Rat(num: String, denom: String) = RatLitExpr.of(BigInteger(num), BigInteger(denom)) From d227befc5b164b9389ab19b27ca9f85b2517cea3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Csan=C3=A1d=20Telbisz?= Date: Sun, 29 Jun 2025 19:56:25 +0200 Subject: [PATCH 33/48] minor fixes (ksp incrementality issue, imports) --- subprojects/common/core/build.gradle.kts | 4 ++ .../hu/bme/mit/theta/grammar/dsl/ExprTest.kt | 43 ++++++++++++++++--- .../hu/bme/mit/theta/grammar/dsl/StmtTest.kt | 12 ++---- .../theta/ksp/PolymorphicModuleProcessor.kt | 41 +++++++++++------- .../ksp/PolymorphicModuleProcessorProvider.kt | 2 +- 5 files changed, 70 insertions(+), 32 deletions(-) diff --git a/subprojects/common/core/build.gradle.kts b/subprojects/common/core/build.gradle.kts index c4414e105c..1479cb3891 100644 --- a/subprojects/common/core/build.gradle.kts +++ b/subprojects/common/core/build.gradle.kts @@ -44,3 +44,7 @@ tasks.withType { "kspTestFixturesKotlin" -> dependsOn("generateTestFixturesGrammarSource") } } + +ksp { + arg("incremental", "false") +} diff --git a/subprojects/common/grammar/src/test/java/hu/bme/mit/theta/grammar/dsl/ExprTest.kt b/subprojects/common/grammar/src/test/java/hu/bme/mit/theta/grammar/dsl/ExprTest.kt index 9dca4e8338..212fa20dec 100644 --- a/subprojects/common/grammar/src/test/java/hu/bme/mit/theta/grammar/dsl/ExprTest.kt +++ b/subprojects/common/grammar/src/test/java/hu/bme/mit/theta/grammar/dsl/ExprTest.kt @@ -15,7 +15,6 @@ */ package hu.bme.mit.theta.grammar.dsl -import hu.bme.mit.theta.common.Tuple2 import hu.bme.mit.theta.common.dsl.Env import hu.bme.mit.theta.common.dsl.Symbol import hu.bme.mit.theta.common.dsl.SymbolTable @@ -24,16 +23,46 @@ import hu.bme.mit.theta.core.decl.Decls.Param import hu.bme.mit.theta.core.decl.Decls.Var import hu.bme.mit.theta.core.decl.ParamDecl import hu.bme.mit.theta.core.type.Expr -import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.* -import hu.bme.mit.theta.core.type.anytype.Exprs.* +import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Add +import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Div +import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Eq +import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Geq +import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Gt +import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Ite +import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Leq +import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Lt +import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Mod +import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Mul +import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Neg +import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Pos +import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Rem +import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Sub +import hu.bme.mit.theta.core.type.anytype.Exprs.Dereference +import hu.bme.mit.theta.core.type.anytype.Exprs.Prime import hu.bme.mit.theta.core.type.anytype.RefExpr import hu.bme.mit.theta.core.type.arraytype.ArrayLitExpr import hu.bme.mit.theta.core.type.arraytype.ArrayReadExpr import hu.bme.mit.theta.core.type.arraytype.ArrayType import hu.bme.mit.theta.core.type.arraytype.ArrayWriteExpr -import hu.bme.mit.theta.core.type.booltype.BoolExprs.* +import hu.bme.mit.theta.core.type.booltype.BoolExprs.And +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Exists +import hu.bme.mit.theta.core.type.booltype.BoolExprs.False +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Forall +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Iff +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Imply +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Not +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Or +import hu.bme.mit.theta.core.type.booltype.BoolExprs.True +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Xor import hu.bme.mit.theta.core.type.bvtype.BvExprs -import hu.bme.mit.theta.core.type.bvtype.BvExprs.* +import hu.bme.mit.theta.core.type.bvtype.BvExprs.Bv +import hu.bme.mit.theta.core.type.bvtype.BvExprs.BvType +import hu.bme.mit.theta.core.type.bvtype.BvExprs.Concat +import hu.bme.mit.theta.core.type.bvtype.BvExprs.Extract +import hu.bme.mit.theta.core.type.bvtype.BvExprs.Not +import hu.bme.mit.theta.core.type.bvtype.BvExprs.SExt +import hu.bme.mit.theta.core.type.bvtype.BvExprs.UDiv +import hu.bme.mit.theta.core.type.bvtype.BvExprs.ZExt import hu.bme.mit.theta.core.type.fptype.FpExprs import hu.bme.mit.theta.core.type.fptype.FpExprs.Max import hu.bme.mit.theta.core.type.fptype.FpExprs.Min @@ -90,13 +119,13 @@ class ExprTest { emptyMap>(), ), arrayOf( - ArrayLitExpr.of(listOf(Tuple2.of(Int(0), Int(1))), Int(2), ArrayType.of(Int(), Int())), + ArrayLitExpr.of(listOf(Pair(Int(0), Int(1))), Int(2), ArrayType.of(Int(), Int())), "(array (0 1) (default 2))", emptyMap>(), ), arrayOf( ArrayLitExpr.of( - listOf(Tuple2.of(Int(0), Int(1)), Tuple2.of(Int(1), Int(2))), + listOf(Pair(Int(0), Int(1)), Pair(Int(1), Int(2))), Int(3), ArrayType.of(Int(), Int()), ), diff --git a/subprojects/common/grammar/src/test/java/hu/bme/mit/theta/grammar/dsl/StmtTest.kt b/subprojects/common/grammar/src/test/java/hu/bme/mit/theta/grammar/dsl/StmtTest.kt index 2d3b5fdc23..cdae5b3097 100644 --- a/subprojects/common/grammar/src/test/java/hu/bme/mit/theta/grammar/dsl/StmtTest.kt +++ b/subprojects/common/grammar/src/test/java/hu/bme/mit/theta/grammar/dsl/StmtTest.kt @@ -22,7 +22,10 @@ import hu.bme.mit.theta.core.decl.Decl import hu.bme.mit.theta.core.decl.Decls.Var import hu.bme.mit.theta.core.decl.ParamDecl import hu.bme.mit.theta.core.stmt.Stmt -import hu.bme.mit.theta.core.stmt.Stmts.* +import hu.bme.mit.theta.core.stmt.Stmts.Assign +import hu.bme.mit.theta.core.stmt.Stmts.Assume +import hu.bme.mit.theta.core.stmt.Stmts.Havoc +import hu.bme.mit.theta.core.stmt.Stmts.MemoryAssign import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Eq import hu.bme.mit.theta.core.type.anytype.Exprs.Dereference import hu.bme.mit.theta.core.type.inttype.IntExprs.Int @@ -92,11 +95,4 @@ class StmtTest { val stmt = StatementWrapper(memory.toString(), SimpleScope(symbolTable)).instantiate(env) Assert.assertEquals(memory, stmt) } - - data class NamedSymbol(val _name: String) : Symbol { - - override fun getName(): String { - return _name - } - } } diff --git a/subprojects/common/ksp-processor/src/main/kotlin/hu/bme/mit/theta/ksp/PolymorphicModuleProcessor.kt b/subprojects/common/ksp-processor/src/main/kotlin/hu/bme/mit/theta/ksp/PolymorphicModuleProcessor.kt index 6de1f667c5..c21ffaa0c1 100644 --- a/subprojects/common/ksp-processor/src/main/kotlin/hu/bme/mit/theta/ksp/PolymorphicModuleProcessor.kt +++ b/subprojects/common/ksp-processor/src/main/kotlin/hu/bme/mit/theta/ksp/PolymorphicModuleProcessor.kt @@ -22,7 +22,6 @@ import com.google.devtools.ksp.symbol.* class PolymorphicModuleProcessor( private val codeGenerator: CodeGenerator, - private val logger: KSPLogger, private val pack: String, private val baseClass: String, ) : SymbolProcessor { @@ -31,25 +30,35 @@ class PolymorphicModuleProcessor( val topLevelClassFqn = "$pack.$baseClass" val generatedPack = "$pack.generated" - val subclasses = resolver - .getSymbolsWithAnnotation("kotlinx.serialization.Serializable") - .filterIsInstance() - .filter { !it.isAbstract() && it.getSealedSubclasses().toList().isEmpty() } - .filter { - val allSuperTypes = it.getAllSuperTypes() - allSuperTypes.any { superType -> - superType.declaration.qualifiedName?.asString() == topLevelClassFqn + val subclasses = resolver.getAllFiles().flatMap { file -> + file.declarations + .filterIsInstance() + .filter { !it.isAbstract() && it.getSealedSubclasses().toList().isEmpty() } + .filter { clazz -> + clazz.annotations.any { + it.annotationType.resolve().declaration.qualifiedName?.asString() == "kotlinx.serialization.Serializable" + } } - } - .toList() + .filter { + val allSuperTypes = it.getAllSuperTypes() + allSuperTypes.any { superType -> + superType.declaration.qualifiedName?.asString() == topLevelClassFqn + } + } + }.toList() if (subclasses.isEmpty()) return emptyList() - val file = codeGenerator.createNewFile( - Dependencies(false), - generatedPack, - "${baseClass}Serializer" - ) + val inputFiles = subclasses.mapNotNull { it.containingFile }.distinct() + val file = try { + codeGenerator.createNewFile( + Dependencies(false, *inputFiles.toTypedArray()), + generatedPack, + "${baseClass}Serializer" + ) + } catch (e: FileAlreadyExistsException) { + return emptyList() + } file.bufferedWriter().use { writer -> writer.write("package $generatedPack\n\n") diff --git a/subprojects/common/ksp-processor/src/main/kotlin/hu/bme/mit/theta/ksp/PolymorphicModuleProcessorProvider.kt b/subprojects/common/ksp-processor/src/main/kotlin/hu/bme/mit/theta/ksp/PolymorphicModuleProcessorProvider.kt index 77a50be713..a4f8ff5399 100644 --- a/subprojects/common/ksp-processor/src/main/kotlin/hu/bme/mit/theta/ksp/PolymorphicModuleProcessorProvider.kt +++ b/subprojects/common/ksp-processor/src/main/kotlin/hu/bme/mit/theta/ksp/PolymorphicModuleProcessorProvider.kt @@ -22,7 +22,7 @@ sealed class PolymorphicModuleProcessorProvider( private val baseClass: String, ) : SymbolProcessorProvider { override fun create(environment: SymbolProcessorEnvironment): SymbolProcessor = - PolymorphicModuleProcessor(environment.codeGenerator, environment.logger, pack, baseClass) + PolymorphicModuleProcessor(environment.codeGenerator, pack, baseClass) } class TypeSerializerProcessorProvider : From daee0758a33fa13df29e5bb34050cf9d081e6417 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Csan=C3=A1d=20Telbisz?= Date: Sun, 29 Jun 2025 20:34:10 +0200 Subject: [PATCH 34/48] missing toString overrides --- .../kotlin/hu/bme/mit/theta/core/type/anytype/PrimeExpr.kt | 2 ++ .../hu/bme/mit/theta/core/type/booltype/QuantifiedExpr.kt | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/PrimeExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/PrimeExpr.kt index 8afb7b7a78..a92142d5ae 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/PrimeExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/anytype/PrimeExpr.kt @@ -53,6 +53,8 @@ data class PrimeExpr(override val op: Expr) : override val operatorLabel: String = OPERATOR_LABEL + override fun toString(): String = super.toString() + object Serializer : KSerializer> { override val descriptor: SerialDescriptor = buildClassSerialDescriptor("Prime") { element>("op") } diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/QuantifiedExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/QuantifiedExpr.kt index 0db748899d..2359afc81c 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/QuantifiedExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/QuantifiedExpr.kt @@ -79,6 +79,8 @@ data class ExistsExpr( if (op == this.op) this else ExistsExpr(paramDecls, op) override val operatorLabel: String = OPERATOR_LABEL + + override fun toString(): String = super.toString() } /** Universal quantifier expression for boolean type. */ @@ -106,4 +108,6 @@ data class ForallExpr( if (op == this.op) this else ForallExpr(paramDecls, op) override val operatorLabel: String = OPERATOR_LABEL + + override fun toString(): String = super.toString() } From 8ebf77bd2ff21647694aabf8e59206004b233d0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Csan=C3=A1d=20Telbisz?= Date: Sun, 29 Jun 2025 21:07:52 +0200 Subject: [PATCH 35/48] minor fixes --- .../main/kotlin/hu/bme/mit/theta/core/type/booltype/AndExpr.kt | 2 +- .../main/kotlin/hu/bme/mit/theta/core/type/booltype/OrExpr.kt | 2 +- .../main/kotlin/hu/bme/mit/theta/core/type/fptype/FpDivExpr.kt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/AndExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/AndExpr.kt index fd8b751618..9bc1d64cb7 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/AndExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/AndExpr.kt @@ -47,7 +47,7 @@ data class AndExpr(override val ops: List>) : MultiaryExpr>): AndExpr = of(ops) - override fun toString(): String = Utils.lispStringBuilder(OPERATOR_LABEL).add(ops).toString() + override fun toString(): String = super.toString() override val operatorLabel: String get() = OPERATOR_LABEL diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/OrExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/OrExpr.kt index 5a2db5c3aa..3b2c0e9ffa 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/OrExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/OrExpr.kt @@ -47,7 +47,7 @@ data class OrExpr(override val ops: List>) : MultiaryExpr>): OrExpr = of(ops) - override fun toString(): String = Utils.lispStringBuilder(OPERATOR_LABEL).add(ops).toString() + override fun toString(): String = super.toString() override val operatorLabel: String get() = OPERATOR_LABEL diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpDivExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpDivExpr.kt index 3d53f74dec..f2ff4e2efe 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpDivExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpDivExpr.kt @@ -59,7 +59,7 @@ data class FpDivExpr( of(roundingMode, leftOp, rightOp) override val operatorLabel: String - get() = OPERATOR_LABEL + get() = "$OPERATOR_LABEL[${roundingMode.name.lowercase()}]" override fun toString(): String = super.toString() } From 9e5f6037d17e7693821e4ab324329fb0fbb56d59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Csan=C3=A1d=20Telbisz?= Date: Sun, 29 Jun 2025 23:25:18 +0200 Subject: [PATCH 36/48] expression serialization test --- .../core/type/arraytype/ArrayInitExpr.kt | 9 +- .../mit/theta/core/type/booltype/AndExpr.kt | 1 - .../mit/theta/core/type/booltype/OrExpr.kt | 1 - .../theta/core/type/enumtype/EnumLitExpr.kt | 5 +- .../theta/core/type/functype/FuncLitExpr.kt | 11 +- .../serialization/ExprSerializationTest.kt | 1127 +++++++++++++++++ .../MultiNondetDiningPhilosophersTest.kt | 4 +- 7 files changed, 1140 insertions(+), 18 deletions(-) create mode 100644 subprojects/common/core/src/test/kotlin/hu/bme/mit/theta/core/serialization/ExprSerializationTest.kt diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayInitExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayInitExpr.kt index 7728ec86d0..fb17eeafcf 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayInitExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayInitExpr.kt @@ -130,12 +130,7 @@ data class ArrayInitExpr( value.elements, ) encodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class), value.elseElem) - encodeSerializableElement( - descriptor, - 2, - PolymorphicSerializer(ArrayType::class), - value.type, - ) + encodeSerializableElement(descriptor, 2, PolymorphicSerializer(Type::class), value.type) } override fun deserialize(decoder: Decoder): ArrayInitExpr = @@ -164,7 +159,7 @@ data class ArrayInitExpr( as Expr 2 -> type = - decodeSerializableElement(descriptor, 2, PolymorphicSerializer(ArrayType::class)) + decodeSerializableElement(descriptor, 2, PolymorphicSerializer(Type::class)) as ArrayType CompositeDecoder.DECODE_DONE -> break else -> throw SerializationException("Unknown index $i") diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/AndExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/AndExpr.kt index 9bc1d64cb7..050c37e616 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/AndExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/AndExpr.kt @@ -15,7 +15,6 @@ */ package hu.bme.mit.theta.core.type.booltype -import hu.bme.mit.theta.common.Utils import hu.bme.mit.theta.core.model.Valuation import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.MultiaryExpr diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/OrExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/OrExpr.kt index 3b2c0e9ffa..188c78e32f 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/OrExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/booltype/OrExpr.kt @@ -15,7 +15,6 @@ */ package hu.bme.mit.theta.core.type.booltype -import hu.bme.mit.theta.common.Utils import hu.bme.mit.theta.core.model.Valuation import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.MultiaryExpr diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/enumtype/EnumLitExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/enumtype/EnumLitExpr.kt index 4568d7bfd8..643a46d5f0 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/enumtype/EnumLitExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/enumtype/EnumLitExpr.kt @@ -28,12 +28,15 @@ import kotlinx.serialization.Serializable data class EnumLitExpr(override val type: EnumType, val value: String) : NullaryExpr(), LitExpr { + init { + require(value in type.values) { "Invalid value $value for type ${type.name}" } + } + companion object { @JvmStatic fun of(type: EnumType, literalName: String): EnumLitExpr { val value = EnumType.getShortName(literalName) - require(value in type.values) { "Invalid value $value for type ${type.name}" } return EnumLitExpr(type, value) } diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/functype/FuncLitExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/functype/FuncLitExpr.kt index c7b964730b..8715a03d54 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/functype/FuncLitExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/functype/FuncLitExpr.kt @@ -16,6 +16,7 @@ package hu.bme.mit.theta.core.type.functype import hu.bme.mit.theta.common.Utils +import hu.bme.mit.theta.core.decl.Decl import hu.bme.mit.theta.core.decl.ParamDecl import hu.bme.mit.theta.core.model.Valuation import hu.bme.mit.theta.core.type.Expr @@ -75,12 +76,7 @@ data class FuncLitExpr( override fun serialize(encoder: Encoder, value: FuncLitExpr) = encoder.encodeStructure(descriptor) { - encodeSerializableElement( - descriptor, - 0, - PolymorphicSerializer(ParamDecl::class), - value.param, - ) + encodeSerializableElement(descriptor, 0, PolymorphicSerializer(Decl::class), value.param) encodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class), value.result) } @@ -92,7 +88,8 @@ data class FuncLitExpr( when (val i = decodeElementIndex(descriptor)) { 0 -> param = - decodeSerializableElement(descriptor, 0, PolymorphicSerializer(ParamDecl::class)) + decodeSerializableElement(descriptor, 0, PolymorphicSerializer(Decl::class)) + as ParamDecl 1 -> result = decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Expr::class)) CompositeDecoder.DECODE_DONE -> break diff --git a/subprojects/common/core/src/test/kotlin/hu/bme/mit/theta/core/serialization/ExprSerializationTest.kt b/subprojects/common/core/src/test/kotlin/hu/bme/mit/theta/core/serialization/ExprSerializationTest.kt new file mode 100644 index 0000000000..1a92ef58c2 --- /dev/null +++ b/subprojects/common/core/src/test/kotlin/hu/bme/mit/theta/core/serialization/ExprSerializationTest.kt @@ -0,0 +1,1127 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.serialization + +import hu.bme.mit.theta.core.decl.Decls +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.Type +import hu.bme.mit.theta.core.type.anytype.* +import hu.bme.mit.theta.core.type.arraytype.* +import hu.bme.mit.theta.core.type.booltype.* +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool +import hu.bme.mit.theta.core.type.booltype.BoolExprs.False +import hu.bme.mit.theta.core.type.booltype.BoolExprs.True +import hu.bme.mit.theta.core.type.bvtype.* +import hu.bme.mit.theta.core.type.enumtype.EnumEqExpr +import hu.bme.mit.theta.core.type.enumtype.EnumLitExpr +import hu.bme.mit.theta.core.type.enumtype.EnumNeqExpr +import hu.bme.mit.theta.core.type.enumtype.EnumType +import hu.bme.mit.theta.core.type.fptype.* +import hu.bme.mit.theta.core.type.fptype.FpRoundingMode.* +import hu.bme.mit.theta.core.type.functype.FuncAppExpr +import hu.bme.mit.theta.core.type.functype.FuncLitExpr +import hu.bme.mit.theta.core.type.inttype.* +import hu.bme.mit.theta.core.type.inttype.IntExprs.Eq +import hu.bme.mit.theta.core.type.inttype.IntExprs.Int +import hu.bme.mit.theta.core.type.rattype.* +import java.math.BigInteger +import kotlinx.serialization.encodeToString +import org.junit.jupiter.api.Assertions.* +import org.junit.jupiter.api.Test + +@Suppress("UNCHECKED_CAST") +class ExprSerializationTest { + + companion object { + + private val json = coreJson + + private val bv1 = BvLitExpr(booleanArrayOf(true, false), true) + private val bv2 = BvLitExpr(booleanArrayOf(false, true)) + + private val fp1 = FpLitExpr(false, bv1, bv2) + private val fp2 = FpLitExpr(false, bv2, bv1) + + private val rat1 = RatLitExpr(BigInteger.valueOf(1), BigInteger.valueOf(2)) + private val rat2 = RatLitExpr(BigInteger.valueOf(3), BigInteger.valueOf(4)) + + private val enumType = EnumType("Color", mapOf("Red" to 0, "Green" to 1, "Blue" to 2)) + + private val func = FuncLitExpr(Decls.Param("x", Int()), False()) + } + + @Test + fun `test Dereference serialization`() { + val expr = Dereference(Int(0), True(), Int()) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as Dereference).array.type } + } + + @Test + fun `test InvalidLitExpr serialization`() { + val expr = InvalidLitExpr(Int()) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertNotEquals(expr, deserialized) // special case, never equal + assertDoesNotThrow { (deserialized as InvalidLitExpr).type } + } + + @Test + fun `test IteExpr serialization`() { + val expr = IteExpr(Eq(Int(0), Int(1)), Int(2), Int(3)) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as IteExpr).then } + } + + @Test + fun `test PrimeExpr serialization`() { + val expr = PrimeExpr(Int(0)) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as PrimeExpr).op } + } + + @Test + fun `test RefExpr serialization`() { + val expr = RefExpr(Decls.Var("x", Int())) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as RefExpr).decl } + } + + @Test + fun `test Reference serialization`() { + val expr = Reference(Int(0), Bool()) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as Reference).expr } + } + + @Test + fun `test ArrayEqExpr serialization`() { + val expr = + ArrayEqExpr( + ArrayLitExpr(listOf(), Int(0), ArrayType(Bool(), Int())), + ArrayLitExpr(listOf(), Int(1), ArrayType(Bool(), Int())), + ) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as ArrayEqExpr).leftOp } + } + + @Test + fun `test ArrayInitExpr serialization`() { + val expr = ArrayInitExpr(listOf(Int(0) to Int(1)), Int(2), ArrayType(Int(), Int())) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as ArrayInitExpr).elements } + } + + @Test + fun `test ArrayLitExpr serialization`() { + val expr = ArrayLitExpr(listOf(Int(0) to Int(1)), Int(2), ArrayType(Int(), Int())) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as ArrayLitExpr).elements } + } + + @Test + fun `test ArrayNeqExpr serialization`() { + val expr = + ArrayNeqExpr( + ArrayLitExpr(listOf(), Int(0), ArrayType(Bool(), Int())), + ArrayLitExpr(listOf(), Int(1), ArrayType(Bool(), Int())), + ) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as ArrayNeqExpr).leftOp } + } + + @Test + fun `test ArrayReadExpr serialization`() { + val expr = ArrayReadExpr(ArrayLitExpr(listOf(), Int(0), ArrayType(Int(), Int())), Int(1)) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as ArrayReadExpr).array } + } + + @Test + fun `test ArrayWriteExpr serialization`() { + val expr = + ArrayWriteExpr(ArrayLitExpr(listOf(), Int(0), ArrayType(Int(), Int())), Int(1), Int(2)) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as ArrayWriteExpr).array } + } + + @Test + fun `test AndExpr serialization`() { + val expr = AndExpr(listOf(True(), False())) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as AndExpr).ops } + } + + @Test + fun `test FalseExpr serialization`() { + val expr = False() + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { deserialized as FalseExpr } + } + + @Test + fun `test TrueExpr serialization`() { + val expr = True() + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { deserialized as TrueExpr } + } + + @Test + fun `test IffExpr serialization`() { + val expr = IffExpr(True(), False()) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as IffExpr).leftOp } + } + + @Test + fun `test ImplyExpr serialization`() { + val expr = ImplyExpr(True(), False()) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as ImplyExpr).leftOp } + } + + @Test + fun `test NotExpr serialization`() { + val expr = NotExpr(True()) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as NotExpr).op } + } + + @Test + fun `test OrExpr serialization`() { + val expr = OrExpr(listOf(True(), False())) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as OrExpr).ops } + } + + @Test + fun `test ExistsExpr serialization`() { + val expr = ExistsExpr(listOf(Decls.Param("x", Int())), True()) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as ExistsExpr).paramDecls } + } + + @Test + fun `test ForallExpr serialization`() { + val expr = ForallExpr(listOf(Decls.Param("x", Int())), True()) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as ForallExpr).paramDecls } + } + + @Test + fun `test XorExpr serialization`() { + val expr = XorExpr(True(), False()) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as XorExpr).leftOp } + } + + @Test + fun `test BvAddExpr serialization`() { + val expr = BvAddExpr(listOf(bv1, bv2)) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as BvAddExpr).ops } + } + + @Test + fun `test BvAndExpr serialization`() { + val expr = BvAndExpr(listOf(bv1, bv2)) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as BvAndExpr).ops } + } + + @Test + fun `test BvArithShiftRightExpr serialization`() { + val expr = BvArithShiftRightExpr(bv1, bv2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as BvArithShiftRightExpr).leftOp } + } + + @Test + fun `test BvConcatExpr serialization`() { + val expr = BvConcatExpr(listOf(bv1, bv2)) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as BvConcatExpr).ops } + } + + @Test + fun `test BvEqExpr serialization`() { + val expr = BvEqExpr(bv1, bv2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as BvEqExpr).leftOp } + } + + @Test + fun `test BvExtractExpr serialization`() { + val expr = BvExtractExpr(BvLitExpr(booleanArrayOf(true, false), true), Int(0), Int(1)) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as BvExtractExpr).from } + } + + @Test + fun `test BvLitExpr serialization`() { + val expr = BvLitExpr(booleanArrayOf(true, false), true) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as BvLitExpr).value } + } + + @Test + fun `test BvLogicShiftRightExpr serialization`() { + val expr = BvLogicShiftRightExpr(bv1, bv2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as BvLogicShiftRightExpr).leftOp } + } + + @Test + fun `test BvMulExpr serialization`() { + val expr = BvMulExpr(listOf(bv1, bv2)) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as BvMulExpr).ops } + } + + @Test + fun `test BvNegExpr serialization`() { + val expr = BvNegExpr(BvLitExpr(booleanArrayOf(true, false), true)) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as BvNegExpr).op } + } + + @Test + fun `test BvNeqExpr serialization`() { + val expr = BvNeqExpr(bv1, bv2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as BvNeqExpr).leftOp } + } + + @Test + fun `test BvNotExpr serialization`() { + val expr = BvNotExpr(BvLitExpr(booleanArrayOf(true, false), true)) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as BvNotExpr).op } + } + + @Test + fun `test BvOrExpr serialization`() { + val expr = BvOrExpr(listOf(bv1, bv2)) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as BvOrExpr).ops } + } + + @Test + fun `test BvPosExpr serialization`() { + val expr = BvPosExpr(BvLitExpr(booleanArrayOf(true, false), true)) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as BvPosExpr).op } + } + + @Test + fun `test BvRotateLeftExpr serialization`() { + val expr = BvRotateLeftExpr(bv1, bv2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as BvRotateLeftExpr).leftOp } + } + + @Test + fun `test BvRotateRightExpr serialization`() { + val expr = BvRotateRightExpr(bv1, bv2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as BvRotateRightExpr).leftOp } + } + + @Test + fun `test BvSDivExpr serialization`() { + val expr = BvSDivExpr(bv1, bv2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as BvSDivExpr).leftOp } + } + + @Test + fun `test BvSExtExpr serialization`() { + val expr = BvSExtExpr(bv1, BvType(16, null)) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as BvSExtExpr).op } + } + + @Test + fun `test BvSGeqExpr serialization`() { + val expr = BvSGeqExpr(bv1, bv2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as BvSGeqExpr).leftOp } + } + + @Test + fun `test BvSGtExpr serialization`() { + val expr = BvSGtExpr(bv1, bv2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as BvSGtExpr).leftOp } + } + + @Test + fun `test BvSLeqExpr serialization`() { + val expr = BvSLeqExpr(bv1, bv2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as BvSLeqExpr).leftOp } + } + + @Test + fun `test BvSLtExpr serialization`() { + val expr = BvSLtExpr(bv1, bv2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as BvSLtExpr).leftOp } + } + + @Test + fun `test BvSModExpr serialization`() { + val expr = BvSModExpr(bv1, bv2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as BvSModExpr).leftOp } + } + + @Test + fun `test BvSRemExpr serialization`() { + val expr = BvSRemExpr(bv1, bv2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as BvSRemExpr).leftOp } + } + + @Test + fun `test BvShiftLeftExpr serialization`() { + val expr = BvShiftLeftExpr(bv1, bv2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as BvShiftLeftExpr).leftOp } + } + + @Test + fun `test BvSignChangeExpr serialization`() { + val expr = BvSignChangeExpr(bv1, BvType(2, false)) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as BvSignChangeExpr).op } + } + + @Test + fun `test BvSubExpr serialization`() { + val expr = BvSubExpr(bv1, bv2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as BvSubExpr).leftOp } + } + + @Test + fun `test BvUDivExpr serialization`() { + val expr = BvUDivExpr(bv1, bv2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as BvUDivExpr).leftOp } + } + + @Test + fun `test BvUGeqExpr serialization`() { + val expr = BvUGeqExpr(bv1, bv2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as BvUGeqExpr).leftOp } + } + + @Test + fun `test BvUGtExpr serialization`() { + val expr = BvUGtExpr(bv1, bv2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as BvUGtExpr).leftOp } + } + + @Test + fun `test BvULeqExpr serialization`() { + val expr = BvULeqExpr(bv1, bv2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as BvULeqExpr).leftOp } + } + + @Test + fun `test BvULtExpr serialization`() { + val expr = BvULtExpr(bv1, bv2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as BvULtExpr).leftOp } + } + + @Test + fun `test BvURemExpr serialization`() { + val expr = BvURemExpr(bv1, bv2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as BvURemExpr).leftOp } + } + + @Test + fun `test BvXorExpr serialization`() { + val expr = BvXorExpr(listOf(bv1, bv2)) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as BvXorExpr).ops } + } + + @Test + fun `test BvZExtExpr serialization`() { + val expr = BvZExtExpr(bv1, BvType(4, true)) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as BvZExtExpr).op } + } + + @Test + fun `test EnumEqExpr serialization`() { + val expr = EnumEqExpr(EnumLitExpr(enumType, "Red"), EnumLitExpr(enumType, "Green")) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as EnumEqExpr).leftOp } + } + + @Test + fun `test EnumLitExpr serialization`() { + val expr = EnumLitExpr(enumType, "Red") + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as EnumLitExpr).value } + } + + @Test + fun `test EnumNeqExpr serialization`() { + val expr = EnumNeqExpr(EnumLitExpr(enumType, "Red"), EnumLitExpr(enumType, "Green")) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as EnumNeqExpr).leftOp } + } + + @Test + fun `test FpAbsExpr serialization`() { + val expr = FpAbsExpr(fp1) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as FpAbsExpr).op } + } + + @Test + fun `test FpAddExpr serialization`() { + val expr = FpAddExpr(RNA, listOf(fp1, fp2)) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as FpAddExpr).roundingMode } + } + + @Test + fun `test FpAssignExpr serialization`() { + val expr = FpAssignExpr(fp1, fp2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as FpAssignExpr).leftOp } + } + + @Test + fun `test FpDivExpr serialization`() { + val expr = FpDivExpr(RNE, fp1, fp2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as FpDivExpr).leftOp } + } + + @Test + fun `test FpEqExpr serialization`() { + val expr = FpEqExpr(fp1, fp2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as FpEqExpr).leftOp } + } + + @Test + fun `test FpFromBvExpr serialization`() { + val expr = FpFromBvExpr(RTN, bv1, FpType(2, 2), false) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as FpFromBvExpr).op } + } + + @Test + fun `test FpGeqExpr serialization`() { + val expr = FpGeqExpr(fp1, fp2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as FpGeqExpr).leftOp } + } + + @Test + fun `test FpGtExpr serialization`() { + val expr = FpGtExpr(fp1, fp2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as FpGtExpr).leftOp } + } + + @Test + fun `test FpIsInfiniteExpr serialization`() { + val expr = FpIsInfiniteExpr(fp1) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as FpIsInfiniteExpr).op } + } + + @Test + fun `test FpIsNanExpr serialization`() { + val expr = FpIsNanExpr(fp1) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as FpIsNanExpr).op } + } + + @Test + fun `test FpLeqExpr serialization`() { + val expr = FpLeqExpr(fp1, fp2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as FpLeqExpr).leftOp } + } + + @Test + fun `test FpLitExpr serialization`() { + val expr = fp1 + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as FpLitExpr).exponent } + } + + @Test + fun `test FpLtExpr serialization`() { + val expr = FpLtExpr(fp1, fp2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as FpLtExpr).leftOp } + } + + @Test + fun `test FpMaxExpr serialization`() { + val expr = FpMaxExpr(fp1, fp2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as FpMaxExpr).leftOp } + } + + @Test + fun `test FpMinExpr serialization`() { + val expr = FpMinExpr(fp1, fp2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as FpMinExpr).leftOp } + } + + @Test + fun `test FpMulExpr serialization`() { + val expr = FpMulExpr(RTP, listOf(fp1, fp2)) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as FpMulExpr).ops } + } + + @Test + fun `test FpNegExpr serialization`() { + val expr = FpNegExpr(fp1) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as FpNegExpr).op } + } + + @Test + fun `test FpNeqExpr serialization`() { + val expr = FpNeqExpr(fp1, fp2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as FpNeqExpr).leftOp } + } + + @Test + fun `test FpPosExpr serialization`() { + val expr = FpPosExpr(fp1) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as FpPosExpr).op } + } + + @Test + fun `test FpRemExpr serialization`() { + val expr = FpRemExpr(fp1, fp2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as FpRemExpr).leftOp } + } + + @Test + fun `test FpRoundToIntegralExpr serialization`() { + val expr = FpRoundToIntegralExpr(RTZ, fp1) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as FpRoundToIntegralExpr).op } + } + + @Test + fun `test FpSqrtExpr serialization`() { + val expr = FpSqrtExpr(RNE, fp1) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as FpSqrtExpr).op } + } + + @Test + fun `test FpSubExpr serialization`() { + val expr = FpSubExpr(RNE, fp1, fp2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as FpSubExpr).leftOp } + } + + @Test + fun `test FpToBvExpr serialization`() { + val expr = FpToBvExpr(RNE, fp1, 8, true) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as FpToBvExpr).op } + } + + @Test + fun `test FpToFpExpr serialization`() { + val expr = FpToFpExpr(RNE, fp1, 8, 24) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as FpToFpExpr).op } + } + + @Test + fun `test FuncAppExpr serialization`() { + val expr = FuncAppExpr(func, Int(1)) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as FuncAppExpr).func } + } + + @Test + fun `test FuncLitExpr serialization`() { + val expr = func + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as FuncLitExpr).result } + } + + @Test + fun `test IntAddExpr serialization`() { + val expr = IntAddExpr(listOf(Int(1), Int(2))) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as IntAddExpr).ops } + } + + @Test + fun `test IntDivExpr serialization`() { + val expr = IntDivExpr(Int(4), Int(2)) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as IntDivExpr).leftOp } + } + + @Test + fun `test IntEqExpr serialization`() { + val expr = IntEqExpr(Int(1), Int(1)) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as IntEqExpr).leftOp } + } + + @Test + fun `test IntGeqExpr serialization`() { + val expr = IntGeqExpr(Int(2), Int(1)) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as IntGeqExpr).leftOp } + } + + @Test + fun `test IntGtExpr serialization`() { + val expr = IntGtExpr(Int(2), Int(1)) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as IntGtExpr).leftOp } + } + + @Test + fun `test IntLeqExpr serialization`() { + val expr = IntLeqExpr(Int(1), Int(2)) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as IntLeqExpr).leftOp } + } + + @Test + fun `test IntLitExpr serialization`() { + val expr = Int(42) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as IntLitExpr).value } + } + + @Test + fun `test IntLtExpr serialization`() { + val expr = IntLtExpr(Int(1), Int(2)) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as IntLtExpr).leftOp } + } + + @Test + fun `test IntModExpr serialization`() { + val expr = IntModExpr(Int(5), Int(2)) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as IntModExpr).leftOp } + } + + @Test + fun `test IntMulExpr serialization`() { + val expr = IntMulExpr(listOf(Int(2), Int(3))) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as IntMulExpr).ops } + } + + @Test + fun `test IntNegExpr serialization`() { + val expr = IntNegExpr(Int(2)) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as IntNegExpr).op } + } + + @Test + fun `test IntNeqExpr serialization`() { + val expr = IntNeqExpr(Int(1), Int(2)) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as IntNeqExpr).leftOp } + } + + @Test + fun `test IntPosExpr serialization`() { + val expr = IntPosExpr(Int(2)) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as IntPosExpr).op } + } + + @Test + fun `test IntRemExpr serialization`() { + val expr = IntRemExpr(Int(5), Int(2)) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as IntRemExpr).leftOp } + } + + @Test + fun `test IntSubExpr serialization`() { + val expr = IntSubExpr(Int(5), Int(2)) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as IntSubExpr).leftOp } + } + + @Test + fun `test IntToRatExpr serialization`() { + val expr = IntToRatExpr(Int(5)) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as IntToRatExpr).op } + } + + @Test + fun `test RatAddExpr serialization`() { + val expr = RatAddExpr(listOf(rat1, rat2)) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as RatAddExpr).ops } + } + + @Test + fun `test RatDivExpr serialization`() { + val expr = RatDivExpr(rat1, rat2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as RatDivExpr).leftOp } + } + + @Test + fun `test RatEqExpr serialization`() { + val expr = RatEqExpr(rat1, rat1) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as RatEqExpr).leftOp } + } + + @Test + fun `test RatGeqExpr serialization`() { + val expr = RatGeqExpr(rat2, rat1) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as RatGeqExpr).leftOp } + } + + @Test + fun `test RatGtExpr serialization`() { + val expr = RatGtExpr(rat2, rat1) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as RatGtExpr).leftOp } + } + + @Test + fun `test RatLeqExpr serialization`() { + val expr = RatLeqExpr(rat1, rat2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as RatLeqExpr).leftOp } + } + + @Test + fun `test RatLitExpr serialization`() { + val expr = rat1 + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as RatLitExpr).denom } + } + + @Test + fun `test RatLtExpr serialization`() { + val expr = RatLtExpr(rat1, rat2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as RatLtExpr).leftOp } + } + + @Test + fun `test RatMulExpr serialization`() { + val expr = RatMulExpr(listOf(rat1, rat2)) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as RatMulExpr).ops } + } + + @Test + fun `test RatNegExpr serialization`() { + val expr = RatNegExpr(rat2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as RatNegExpr).op } + } + + @Test + fun `test RatNeqExpr serialization`() { + val expr = RatNeqExpr(rat1, rat2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as RatNeqExpr).leftOp } + } + + @Test + fun `test RatPosExpr serialization`() { + val expr = RatPosExpr(rat2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as RatPosExpr).op } + } + + @Test + fun `test RatSubExpr serialization`() { + val expr = RatSubExpr(rat2, rat1) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as RatSubExpr).leftOp } + } + + @Test + fun `test RatToIntExpr serialization`() { + val expr = RatToIntExpr(rat2) + val serialized = json.encodeToString>(expr) + val deserialized = json.decodeFromString>(serialized) + assertEquals(expr, deserialized) + assertDoesNotThrow { (deserialized as RatToIntExpr).op } + } +} diff --git a/subprojects/common/multi-tests/src/test/kotlin/multi/MultiNondetDiningPhilosophersTest.kt b/subprojects/common/multi-tests/src/test/kotlin/multi/MultiNondetDiningPhilosophersTest.kt index a3b44a187f..2bd5cb6730 100644 --- a/subprojects/common/multi-tests/src/test/kotlin/multi/MultiNondetDiningPhilosophersTest.kt +++ b/subprojects/common/multi-tests/src/test/kotlin/multi/MultiNondetDiningPhilosophersTest.kt @@ -36,7 +36,9 @@ import hu.bme.mit.theta.common.logging.ConsoleLogger import hu.bme.mit.theta.common.logging.Logger import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Eq -import hu.bme.mit.theta.core.type.booltype.BoolExprs.* +import hu.bme.mit.theta.core.type.booltype.BoolExprs.And +import hu.bme.mit.theta.core.type.booltype.BoolExprs.False +import hu.bme.mit.theta.core.type.booltype.BoolExprs.True import hu.bme.mit.theta.core.type.booltype.BoolType import hu.bme.mit.theta.solver.Solver import hu.bme.mit.theta.solver.z3legacy.Z3LegacySolverFactory From b14294319515f530c544e870ead0bf5d79433a1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Csan=C3=A1d=20Telbisz?= Date: Sun, 29 Jun 2025 23:56:12 +0200 Subject: [PATCH 37/48] fixing rest of tests --- .../solver/javasmt/JavaSMTSolverTest.java | 49 ++++++++----------- .../smtlib/GenericSmtLibHornSolverTest.kt | 15 +++--- .../theta/solver/z3legacy/Z3SolverTest.java | 47 ++++++++---------- .../mit/theta/solver/z3/Z3HornSolverTest.kt | 10 ++-- .../bme/mit/theta/solver/z3/Z3SolverTest.java | 47 ++++++++---------- .../bme/mit/theta/xcfa/model/XcfaDslTest.kt | 3 +- .../hu/bme/mit/theta/xcfa/passes/UtilsTest.kt | 5 +- .../hu/bme/mit/theta/xcfa2chc/TestChcUtils.kt | 10 +++- 8 files changed, 91 insertions(+), 95 deletions(-) diff --git a/subprojects/solver/solver-javasmt/src/test/java/hu/bme/mit/theta/solver/javasmt/JavaSMTSolverTest.java b/subprojects/solver/solver-javasmt/src/test/java/hu/bme/mit/theta/solver/javasmt/JavaSMTSolverTest.java index e74c79f064..69e7a74ec2 100644 --- a/subprojects/solver/solver-javasmt/src/test/java/hu/bme/mit/theta/solver/javasmt/JavaSMTSolverTest.java +++ b/subprojects/solver/solver-javasmt/src/test/java/hu/bme/mit/theta/solver/javasmt/JavaSMTSolverTest.java @@ -15,28 +15,8 @@ */ package hu.bme.mit.theta.solver.javasmt; -import static com.google.common.collect.ImmutableList.of; -import static hu.bme.mit.theta.core.decl.Decls.Const; -import static hu.bme.mit.theta.core.decl.Decls.Param; -import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.Array; -import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.ArrayInit; -import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.Read; -import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.Write; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.True; -import static hu.bme.mit.theta.core.type.bvtype.BvExprs.Bv; -import static hu.bme.mit.theta.core.type.bvtype.BvExprs.BvType; -import static hu.bme.mit.theta.core.type.functype.FuncExprs.App; -import static hu.bme.mit.theta.core.type.functype.FuncExprs.Func; -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Add; -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Eq; -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; - import hu.bme.mit.theta.common.OsHelper; import hu.bme.mit.theta.common.OsHelper.OperatingSystem; -import hu.bme.mit.theta.common.Tuple2; import hu.bme.mit.theta.core.decl.ConstDecl; import hu.bme.mit.theta.core.decl.ParamDecl; import hu.bme.mit.theta.core.model.ImmutableValuation; @@ -57,17 +37,28 @@ import hu.bme.mit.theta.solver.Solver; import hu.bme.mit.theta.solver.SolverStatus; import hu.bme.mit.theta.solver.UCSolver; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; -import java.util.Optional; +import kotlin.Pair; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameters; import org.sosy_lab.java_smt.SolverContextFactory.Solvers; +import java.util.*; + +import static com.google.common.collect.ImmutableList.of; +import static hu.bme.mit.theta.core.decl.Decls.Const; +import static hu.bme.mit.theta.core.decl.Decls.Param; +import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.*; +import static hu.bme.mit.theta.core.type.booltype.BoolExprs.True; +import static hu.bme.mit.theta.core.type.bvtype.BvExprs.Bv; +import static hu.bme.mit.theta.core.type.bvtype.BvExprs.BvType; +import static hu.bme.mit.theta.core.type.functype.FuncExprs.App; +import static hu.bme.mit.theta.core.type.functype.FuncExprs.Func; +import static hu.bme.mit.theta.core.type.inttype.IntExprs.*; +import static hu.bme.mit.theta.core.type.inttype.IntExprs.Eq; +import static org.junit.Assert.*; + @RunWith(Parameterized.class) public final class JavaSMTSolverTest { @@ -205,11 +196,11 @@ public void testArray() { // @Test public void testArrayInit() { final ConstDecl> arr = Const("arr", Array(Int(), Int())); - var elems = new ArrayList, Expr>>(); + var elems = new ArrayList, Expr>>(); ConstDecl noname = Const("noname", Int()); - elems.add(Tuple2.of(Int(0), Int(1))); - elems.add(Tuple2.of(Int(1), Int(2))); - elems.add(Tuple2.of(Int(2), Add(noname.getRef(), Int(3)))); + elems.add(new Pair<>(Int(0), Int(1))); + elems.add(new Pair<>(Int(1), Int(2))); + elems.add(new Pair<>(Int(2), Add(noname.getRef(), Int(3)))); var initarr = ArrayInit(elems, Int(100), Array(Int(), Int())); solver.add(ArrayExprs.Eq(arr.getRef(), initarr)); diff --git a/subprojects/solver/solver-smtlib/src/test/java/hu/bme/mit/theta/solver/smtlib/GenericSmtLibHornSolverTest.kt b/subprojects/solver/solver-smtlib/src/test/java/hu/bme/mit/theta/solver/smtlib/GenericSmtLibHornSolverTest.kt index 120e8874d5..2bb6098dc3 100644 --- a/subprojects/solver/solver-smtlib/src/test/java/hu/bme/mit/theta/solver/smtlib/GenericSmtLibHornSolverTest.kt +++ b/subprojects/solver/solver-smtlib/src/test/java/hu/bme/mit/theta/solver/smtlib/GenericSmtLibHornSolverTest.kt @@ -21,7 +21,11 @@ import hu.bme.mit.theta.core.ParamHolder import hu.bme.mit.theta.core.Relation import hu.bme.mit.theta.core.decl.Decls.Const import hu.bme.mit.theta.core.plus -import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.* +import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Add +import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Eq +import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Gt +import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Leq +import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Lt import hu.bme.mit.theta.core.type.booltype.BoolType import hu.bme.mit.theta.core.type.functype.FuncExprs.App import hu.bme.mit.theta.core.type.functype.FuncLitExpr @@ -69,10 +73,7 @@ class GenericSmtLibHornSolverTest { e.printStackTrace() } - solverFactories.put( - Pair(solver, version), - solverManager!!.getSolverFactory(solver, version), - ) + solverFactories[Pair(solver, version)] = solverManager!!.getSolverFactory(solver, version) } } } @@ -122,14 +123,14 @@ class GenericSmtLibHornSolverTest { Assertions.assertTrue(model.containsKey(init.constDecl)) val checkerSolver = - solverFactories.filter { it.key.first.equals("z3") }.values.first().createSolver() + solverFactories.filter { it.key.first == "z3" }.values.first().createSolver() checkerSolver.use { val p0 = Const("p0", Int()) val p1 = Const("p1", Int()) checkerSolver.add( App( App( - model.get(init.constDecl) as FuncLitExpr>, + model[init.constDecl] as FuncLitExpr>, p0.ref, ), p1.ref, diff --git a/subprojects/solver/solver-z3-legacy/src/test/java/hu/bme/mit/theta/solver/z3legacy/Z3SolverTest.java b/subprojects/solver/solver-z3-legacy/src/test/java/hu/bme/mit/theta/solver/z3legacy/Z3SolverTest.java index 7e79e8a914..4d1baea9fd 100644 --- a/subprojects/solver/solver-z3-legacy/src/test/java/hu/bme/mit/theta/solver/z3legacy/Z3SolverTest.java +++ b/subprojects/solver/solver-z3-legacy/src/test/java/hu/bme/mit/theta/solver/z3legacy/Z3SolverTest.java @@ -15,26 +15,6 @@ */ package hu.bme.mit.theta.solver.z3legacy; -import static com.google.common.collect.ImmutableList.of; -import static hu.bme.mit.theta.core.decl.Decls.Const; -import static hu.bme.mit.theta.core.decl.Decls.Param; -import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.Array; -import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.ArrayInit; -import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.Read; -import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.Write; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.True; -import static hu.bme.mit.theta.core.type.bvtype.BvExprs.Bv; -import static hu.bme.mit.theta.core.type.bvtype.BvExprs.BvType; -import static hu.bme.mit.theta.core.type.functype.FuncExprs.App; -import static hu.bme.mit.theta.core.type.functype.FuncExprs.Func; -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Add; -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Eq; -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; - -import hu.bme.mit.theta.common.Tuple2; import hu.bme.mit.theta.core.decl.ConstDecl; import hu.bme.mit.theta.core.decl.ParamDecl; import hu.bme.mit.theta.core.model.ImmutableValuation; @@ -55,11 +35,26 @@ import hu.bme.mit.theta.solver.Solver; import hu.bme.mit.theta.solver.SolverStatus; import hu.bme.mit.theta.solver.UCSolver; +import kotlin.Pair; +import org.junit.Before; +import org.junit.Test; + import java.util.ArrayList; import java.util.List; import java.util.Optional; -import org.junit.Before; -import org.junit.Test; + +import static com.google.common.collect.ImmutableList.of; +import static hu.bme.mit.theta.core.decl.Decls.Const; +import static hu.bme.mit.theta.core.decl.Decls.Param; +import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.*; +import static hu.bme.mit.theta.core.type.booltype.BoolExprs.True; +import static hu.bme.mit.theta.core.type.bvtype.BvExprs.Bv; +import static hu.bme.mit.theta.core.type.bvtype.BvExprs.BvType; +import static hu.bme.mit.theta.core.type.functype.FuncExprs.App; +import static hu.bme.mit.theta.core.type.functype.FuncExprs.Func; +import static hu.bme.mit.theta.core.type.inttype.IntExprs.*; +import static hu.bme.mit.theta.core.type.inttype.IntExprs.Eq; +import static org.junit.Assert.*; public final class Z3SolverTest { @@ -161,11 +156,11 @@ public void testArray() { @Test public void testArrayInit() { final ConstDecl> arr = Const("arr", Array(Int(), Int())); - var elems = new ArrayList, Expr>>(); + var elems = new ArrayList, Expr>>(); ConstDecl noname = Const("noname", Int()); - elems.add(Tuple2.of(Int(0), Int(1))); - elems.add(Tuple2.of(Int(1), Int(2))); - elems.add(Tuple2.of(Int(2), Add(noname.getRef(), Int(3)))); + elems.add(new Pair<>(Int(0), Int(1))); + elems.add(new Pair<>(Int(1), Int(2))); + elems.add(new Pair<>(Int(2), Add(noname.getRef(), Int(3)))); var initarr = ArrayInit(elems, Int(100), Array(Int(), Int())); solver.add(ArrayExprs.Eq(arr.getRef(), initarr)); diff --git a/subprojects/solver/solver-z3/src/test/java/hu/bme/mit/theta/solver/z3/Z3HornSolverTest.kt b/subprojects/solver/solver-z3/src/test/java/hu/bme/mit/theta/solver/z3/Z3HornSolverTest.kt index fa4bd1bcfd..cdd5044912 100644 --- a/subprojects/solver/solver-z3/src/test/java/hu/bme/mit/theta/solver/z3/Z3HornSolverTest.kt +++ b/subprojects/solver/solver-z3/src/test/java/hu/bme/mit/theta/solver/z3/Z3HornSolverTest.kt @@ -20,7 +20,11 @@ import hu.bme.mit.theta.core.ParamHolder import hu.bme.mit.theta.core.Relation import hu.bme.mit.theta.core.decl.Decls.Const import hu.bme.mit.theta.core.plus -import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.* +import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Add +import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Eq +import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Gt +import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Leq +import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Lt import hu.bme.mit.theta.core.type.booltype.BoolType import hu.bme.mit.theta.core.type.functype.FuncExprs.App import hu.bme.mit.theta.core.type.functype.FuncLitExpr @@ -28,13 +32,13 @@ import hu.bme.mit.theta.core.type.functype.FuncType import hu.bme.mit.theta.core.type.inttype.IntExprs.Int import hu.bme.mit.theta.core.type.inttype.IntType import hu.bme.mit.theta.solver.HornSolver -import java.util.stream.Stream import org.junit.jupiter.api.Assertions import org.junit.jupiter.api.Assumptions import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.params.ParameterizedTest import org.junit.jupiter.params.provider.Arguments import org.junit.jupiter.params.provider.MethodSource +import java.util.stream.Stream class Z3HornSolverTest { companion object { @@ -81,7 +85,7 @@ class Z3HornSolverTest { checkerSolver.add( App( App( - model.get(init.constDecl) as FuncLitExpr>, + model[init.constDecl] as FuncLitExpr>, p0.ref, ), p1.ref, diff --git a/subprojects/solver/solver-z3/src/test/java/hu/bme/mit/theta/solver/z3/Z3SolverTest.java b/subprojects/solver/solver-z3/src/test/java/hu/bme/mit/theta/solver/z3/Z3SolverTest.java index 023e958ab6..41dd4ec912 100644 --- a/subprojects/solver/solver-z3/src/test/java/hu/bme/mit/theta/solver/z3/Z3SolverTest.java +++ b/subprojects/solver/solver-z3/src/test/java/hu/bme/mit/theta/solver/z3/Z3SolverTest.java @@ -15,26 +15,6 @@ */ package hu.bme.mit.theta.solver.z3; -import static com.google.common.collect.ImmutableList.of; -import static hu.bme.mit.theta.core.decl.Decls.Const; -import static hu.bme.mit.theta.core.decl.Decls.Param; -import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.Array; -import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.ArrayInit; -import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.Read; -import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.Write; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.True; -import static hu.bme.mit.theta.core.type.bvtype.BvExprs.Bv; -import static hu.bme.mit.theta.core.type.bvtype.BvExprs.BvType; -import static hu.bme.mit.theta.core.type.functype.FuncExprs.App; -import static hu.bme.mit.theta.core.type.functype.FuncExprs.Func; -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Add; -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Eq; -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; - -import hu.bme.mit.theta.common.Tuple2; import hu.bme.mit.theta.core.decl.ConstDecl; import hu.bme.mit.theta.core.decl.ParamDecl; import hu.bme.mit.theta.core.model.ImmutableValuation; @@ -55,11 +35,26 @@ import hu.bme.mit.theta.solver.Solver; import hu.bme.mit.theta.solver.SolverStatus; import hu.bme.mit.theta.solver.UCSolver; +import kotlin.Pair; +import org.junit.Before; +import org.junit.Test; + import java.util.ArrayList; import java.util.List; import java.util.Optional; -import org.junit.Before; -import org.junit.Test; + +import static com.google.common.collect.ImmutableList.of; +import static hu.bme.mit.theta.core.decl.Decls.Const; +import static hu.bme.mit.theta.core.decl.Decls.Param; +import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.*; +import static hu.bme.mit.theta.core.type.booltype.BoolExprs.True; +import static hu.bme.mit.theta.core.type.bvtype.BvExprs.Bv; +import static hu.bme.mit.theta.core.type.bvtype.BvExprs.BvType; +import static hu.bme.mit.theta.core.type.functype.FuncExprs.App; +import static hu.bme.mit.theta.core.type.functype.FuncExprs.Func; +import static hu.bme.mit.theta.core.type.inttype.IntExprs.*; +import static hu.bme.mit.theta.core.type.inttype.IntExprs.Eq; +import static org.junit.Assert.*; public final class Z3SolverTest { @@ -161,11 +156,11 @@ public void testArray() { // @Test public void testArrayInit() { final ConstDecl> arr = Const("arr", Array(Int(), Int())); - var elems = new ArrayList, Expr>>(); + var elems = new ArrayList, Expr>>(); ConstDecl noname = Const("noname", Int()); - elems.add(Tuple2.of(Int(0), Int(1))); - elems.add(Tuple2.of(Int(1), Int(2))); - elems.add(Tuple2.of(Int(2), Add(noname.getRef(), Int(3)))); + elems.add(new Pair<>(Int(0), Int(1))); + elems.add(new Pair<>(Int(1), Int(2))); + elems.add(new Pair<>(Int(2), Add(noname.getRef(), Int(3)))); var initarr = ArrayInit(elems, Int(100), Array(Int(), Int())); solver.add(ArrayExprs.Eq(arr.getRef(), initarr)); diff --git a/subprojects/xcfa/xcfa/src/test/java/hu/bme/mit/theta/xcfa/model/XcfaDslTest.kt b/subprojects/xcfa/xcfa/src/test/java/hu/bme/mit/theta/xcfa/model/XcfaDslTest.kt index 600ac4a4a4..dce195bde3 100644 --- a/subprojects/xcfa/xcfa/src/test/java/hu/bme/mit/theta/xcfa/model/XcfaDslTest.kt +++ b/subprojects/xcfa/xcfa/src/test/java/hu/bme/mit/theta/xcfa/model/XcfaDslTest.kt @@ -17,7 +17,8 @@ package hu.bme.mit.theta.xcfa.model import hu.bme.mit.theta.core.decl.VarDecl import hu.bme.mit.theta.core.type.anytype.RefExpr -import hu.bme.mit.theta.core.type.inttype.IntExprs.* +import hu.bme.mit.theta.core.type.inttype.IntExprs.Eq +import hu.bme.mit.theta.core.type.inttype.IntExprs.Int import hu.bme.mit.theta.core.type.inttype.IntType import hu.bme.mit.theta.xcfa.model.ParamDirection.* import org.junit.Test diff --git a/subprojects/xcfa/xcfa/src/test/java/hu/bme/mit/theta/xcfa/passes/UtilsTest.kt b/subprojects/xcfa/xcfa/src/test/java/hu/bme/mit/theta/xcfa/passes/UtilsTest.kt index 9926a27c3e..9ae201c78c 100644 --- a/subprojects/xcfa/xcfa/src/test/java/hu/bme/mit/theta/xcfa/passes/UtilsTest.kt +++ b/subprojects/xcfa/xcfa/src/test/java/hu/bme/mit/theta/xcfa/passes/UtilsTest.kt @@ -18,7 +18,10 @@ package hu.bme.mit.theta.xcfa.passes import hu.bme.mit.theta.core.decl.Decl import hu.bme.mit.theta.core.decl.Decls.Var import hu.bme.mit.theta.core.decl.VarDecl -import hu.bme.mit.theta.core.stmt.Stmts.* +import hu.bme.mit.theta.core.stmt.Stmts.Assign +import hu.bme.mit.theta.core.stmt.Stmts.Assume +import hu.bme.mit.theta.core.stmt.Stmts.Havoc +import hu.bme.mit.theta.core.stmt.Stmts.Skip import hu.bme.mit.theta.core.type.inttype.IntExprs.Eq import hu.bme.mit.theta.core.type.inttype.IntExprs.Int import hu.bme.mit.theta.xcfa.model.* diff --git a/subprojects/xcfa/xcfa2chc/src/test/java/hu/bme/mit/theta/xcfa2chc/TestChcUtils.kt b/subprojects/xcfa/xcfa2chc/src/test/java/hu/bme/mit/theta/xcfa2chc/TestChcUtils.kt index 3bb0e2fbc9..e40cfa5f96 100644 --- a/subprojects/xcfa/xcfa2chc/src/test/java/hu/bme/mit/theta/xcfa2chc/TestChcUtils.kt +++ b/subprojects/xcfa/xcfa2chc/src/test/java/hu/bme/mit/theta/xcfa2chc/TestChcUtils.kt @@ -22,10 +22,16 @@ import hu.bme.mit.theta.core.Relation import hu.bme.mit.theta.core.decl.Decls import hu.bme.mit.theta.core.decl.ParamDecl import hu.bme.mit.theta.core.plus -import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.* +import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Add +import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Eq +import hu.bme.mit.theta.core.type.abstracttype.AbstractExprs.Lt import hu.bme.mit.theta.core.type.arraytype.ArrayExprs.Read import hu.bme.mit.theta.core.type.arraytype.ArrayType -import hu.bme.mit.theta.core.type.booltype.BoolExprs.* +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool +import hu.bme.mit.theta.core.type.booltype.BoolExprs.False +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Not +import hu.bme.mit.theta.core.type.booltype.BoolExprs.Or +import hu.bme.mit.theta.core.type.booltype.BoolExprs.True import hu.bme.mit.theta.core.type.inttype.IntExprs import hu.bme.mit.theta.core.type.inttype.IntExprs.Int import hu.bme.mit.theta.core.type.inttype.IntType From fd9460c97f4533546822ef3bd72eb3ba9d34a1cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Csan=C3=A1d=20Telbisz?= Date: Mon, 30 Jun 2025 12:12:45 +0200 Subject: [PATCH 38/48] formatting --- .../solver/javasmt/JavaSMTSolverTest.java | 29 ++++++++-------- .../javasmt/JavaSMTTransformerTest.java | 23 +++++++------ .../smtlib/GenericSmtLibHornSolverTest.kt | 5 +-- .../theta/solver/z3legacy/Z3SolverTest.java | 33 +++++++++---------- .../mit/theta/solver/z3/Z3HornSolverTest.kt | 7 ++-- .../bme/mit/theta/solver/z3/Z3SolverTest.java | 33 +++++++++---------- 6 files changed, 62 insertions(+), 68 deletions(-) diff --git a/subprojects/solver/solver-javasmt/src/test/java/hu/bme/mit/theta/solver/javasmt/JavaSMTSolverTest.java b/subprojects/solver/solver-javasmt/src/test/java/hu/bme/mit/theta/solver/javasmt/JavaSMTSolverTest.java index 69e7a74ec2..889bcc3932 100644 --- a/subprojects/solver/solver-javasmt/src/test/java/hu/bme/mit/theta/solver/javasmt/JavaSMTSolverTest.java +++ b/subprojects/solver/solver-javasmt/src/test/java/hu/bme/mit/theta/solver/javasmt/JavaSMTSolverTest.java @@ -15,6 +15,19 @@ */ package hu.bme.mit.theta.solver.javasmt; +import static com.google.common.collect.ImmutableList.of; +import static hu.bme.mit.theta.core.decl.Decls.Const; +import static hu.bme.mit.theta.core.decl.Decls.Param; +import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.*; +import static hu.bme.mit.theta.core.type.booltype.BoolExprs.True; +import static hu.bme.mit.theta.core.type.bvtype.BvExprs.Bv; +import static hu.bme.mit.theta.core.type.bvtype.BvExprs.BvType; +import static hu.bme.mit.theta.core.type.functype.FuncExprs.App; +import static hu.bme.mit.theta.core.type.functype.FuncExprs.Func; +import static hu.bme.mit.theta.core.type.inttype.IntExprs.*; +import static hu.bme.mit.theta.core.type.inttype.IntExprs.Eq; +import static org.junit.Assert.*; + import hu.bme.mit.theta.common.OsHelper; import hu.bme.mit.theta.common.OsHelper.OperatingSystem; import hu.bme.mit.theta.core.decl.ConstDecl; @@ -37,6 +50,7 @@ import hu.bme.mit.theta.solver.Solver; import hu.bme.mit.theta.solver.SolverStatus; import hu.bme.mit.theta.solver.UCSolver; +import java.util.*; import kotlin.Pair; import org.junit.Test; import org.junit.runner.RunWith; @@ -44,21 +58,6 @@ import org.junit.runners.Parameterized.Parameters; import org.sosy_lab.java_smt.SolverContextFactory.Solvers; -import java.util.*; - -import static com.google.common.collect.ImmutableList.of; -import static hu.bme.mit.theta.core.decl.Decls.Const; -import static hu.bme.mit.theta.core.decl.Decls.Param; -import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.*; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.True; -import static hu.bme.mit.theta.core.type.bvtype.BvExprs.Bv; -import static hu.bme.mit.theta.core.type.bvtype.BvExprs.BvType; -import static hu.bme.mit.theta.core.type.functype.FuncExprs.App; -import static hu.bme.mit.theta.core.type.functype.FuncExprs.Func; -import static hu.bme.mit.theta.core.type.inttype.IntExprs.*; -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Eq; -import static org.junit.Assert.*; - @RunWith(Parameterized.class) public final class JavaSMTSolverTest { diff --git a/subprojects/solver/solver-javasmt/src/test/java/hu/bme/mit/theta/solver/javasmt/JavaSMTTransformerTest.java b/subprojects/solver/solver-javasmt/src/test/java/hu/bme/mit/theta/solver/javasmt/JavaSMTTransformerTest.java index 691de74f5a..aaa17c7570 100644 --- a/subprojects/solver/solver-javasmt/src/test/java/hu/bme/mit/theta/solver/javasmt/JavaSMTTransformerTest.java +++ b/subprojects/solver/solver-javasmt/src/test/java/hu/bme/mit/theta/solver/javasmt/JavaSMTTransformerTest.java @@ -15,11 +15,6 @@ */ package hu.bme.mit.theta.solver.javasmt; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Not; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assume.assumeFalse; -import static org.junit.runners.Parameterized.Parameters; - import com.google.common.collect.Sets; import hu.bme.mit.theta.common.OsHelper; import hu.bme.mit.theta.common.OsHelper.OperatingSystem; @@ -36,11 +31,6 @@ import hu.bme.mit.theta.core.type.functype.FuncType; import hu.bme.mit.theta.core.type.rattype.RatType; import hu.bme.mit.theta.core.utils.ExpressionUtils; -import java.util.Collection; -import java.util.Set; -import java.util.function.BiFunction; -import java.util.function.Predicate; -import java.util.stream.Collectors; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; @@ -53,6 +43,17 @@ import org.sosy_lab.java_smt.SolverContextFactory.Solvers; import org.sosy_lab.java_smt.api.SolverContext; +import java.util.Collection; +import java.util.Set; +import java.util.function.BiFunction; +import java.util.function.Predicate; +import java.util.stream.Collectors; + +import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Not; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assume.assumeFalse; +import static org.junit.runners.Parameterized.Parameters; + @RunWith(Parameterized.class) public class JavaSMTTransformerTest { @@ -141,6 +142,8 @@ && hasExpr( final var expExpr = javaSMTTermTransformer.toExpr(expTerm); try { + System.err.println(expr); + System.err.println(expExpr); Assert.assertEquals(expr, expExpr); } catch (AssertionError e) { if (hasType(expr, type -> type instanceof FuncType)) { diff --git a/subprojects/solver/solver-smtlib/src/test/java/hu/bme/mit/theta/solver/smtlib/GenericSmtLibHornSolverTest.kt b/subprojects/solver/solver-smtlib/src/test/java/hu/bme/mit/theta/solver/smtlib/GenericSmtLibHornSolverTest.kt index 2bb6098dc3..d08084e441 100644 --- a/subprojects/solver/solver-smtlib/src/test/java/hu/bme/mit/theta/solver/smtlib/GenericSmtLibHornSolverTest.kt +++ b/subprojects/solver/solver-smtlib/src/test/java/hu/bme/mit/theta/solver/smtlib/GenericSmtLibHornSolverTest.kt @@ -129,10 +129,7 @@ class GenericSmtLibHornSolverTest { val p1 = Const("p1", Int()) checkerSolver.add( App( - App( - model[init.constDecl] as FuncLitExpr>, - p0.ref, - ), + App(model[init.constDecl] as FuncLitExpr>, p0.ref), p1.ref, ) ) diff --git a/subprojects/solver/solver-z3-legacy/src/test/java/hu/bme/mit/theta/solver/z3legacy/Z3SolverTest.java b/subprojects/solver/solver-z3-legacy/src/test/java/hu/bme/mit/theta/solver/z3legacy/Z3SolverTest.java index 4d1baea9fd..3602229265 100644 --- a/subprojects/solver/solver-z3-legacy/src/test/java/hu/bme/mit/theta/solver/z3legacy/Z3SolverTest.java +++ b/subprojects/solver/solver-z3-legacy/src/test/java/hu/bme/mit/theta/solver/z3legacy/Z3SolverTest.java @@ -15,6 +15,19 @@ */ package hu.bme.mit.theta.solver.z3legacy; +import static com.google.common.collect.ImmutableList.of; +import static hu.bme.mit.theta.core.decl.Decls.Const; +import static hu.bme.mit.theta.core.decl.Decls.Param; +import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.*; +import static hu.bme.mit.theta.core.type.booltype.BoolExprs.True; +import static hu.bme.mit.theta.core.type.bvtype.BvExprs.Bv; +import static hu.bme.mit.theta.core.type.bvtype.BvExprs.BvType; +import static hu.bme.mit.theta.core.type.functype.FuncExprs.App; +import static hu.bme.mit.theta.core.type.functype.FuncExprs.Func; +import static hu.bme.mit.theta.core.type.inttype.IntExprs.*; +import static hu.bme.mit.theta.core.type.inttype.IntExprs.Eq; +import static org.junit.Assert.*; + import hu.bme.mit.theta.core.decl.ConstDecl; import hu.bme.mit.theta.core.decl.ParamDecl; import hu.bme.mit.theta.core.model.ImmutableValuation; @@ -35,26 +48,12 @@ import hu.bme.mit.theta.solver.Solver; import hu.bme.mit.theta.solver.SolverStatus; import hu.bme.mit.theta.solver.UCSolver; -import kotlin.Pair; -import org.junit.Before; -import org.junit.Test; - import java.util.ArrayList; import java.util.List; import java.util.Optional; - -import static com.google.common.collect.ImmutableList.of; -import static hu.bme.mit.theta.core.decl.Decls.Const; -import static hu.bme.mit.theta.core.decl.Decls.Param; -import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.*; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.True; -import static hu.bme.mit.theta.core.type.bvtype.BvExprs.Bv; -import static hu.bme.mit.theta.core.type.bvtype.BvExprs.BvType; -import static hu.bme.mit.theta.core.type.functype.FuncExprs.App; -import static hu.bme.mit.theta.core.type.functype.FuncExprs.Func; -import static hu.bme.mit.theta.core.type.inttype.IntExprs.*; -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Eq; -import static org.junit.Assert.*; +import kotlin.Pair; +import org.junit.Before; +import org.junit.Test; public final class Z3SolverTest { diff --git a/subprojects/solver/solver-z3/src/test/java/hu/bme/mit/theta/solver/z3/Z3HornSolverTest.kt b/subprojects/solver/solver-z3/src/test/java/hu/bme/mit/theta/solver/z3/Z3HornSolverTest.kt index cdd5044912..5832f75866 100644 --- a/subprojects/solver/solver-z3/src/test/java/hu/bme/mit/theta/solver/z3/Z3HornSolverTest.kt +++ b/subprojects/solver/solver-z3/src/test/java/hu/bme/mit/theta/solver/z3/Z3HornSolverTest.kt @@ -32,13 +32,13 @@ import hu.bme.mit.theta.core.type.functype.FuncType import hu.bme.mit.theta.core.type.inttype.IntExprs.Int import hu.bme.mit.theta.core.type.inttype.IntType import hu.bme.mit.theta.solver.HornSolver +import java.util.stream.Stream import org.junit.jupiter.api.Assertions import org.junit.jupiter.api.Assumptions import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.params.ParameterizedTest import org.junit.jupiter.params.provider.Arguments import org.junit.jupiter.params.provider.MethodSource -import java.util.stream.Stream class Z3HornSolverTest { companion object { @@ -84,10 +84,7 @@ class Z3HornSolverTest { val p1 = Const("p1", Int()) checkerSolver.add( App( - App( - model[init.constDecl] as FuncLitExpr>, - p0.ref, - ), + App(model[init.constDecl] as FuncLitExpr>, p0.ref), p1.ref, ) ) diff --git a/subprojects/solver/solver-z3/src/test/java/hu/bme/mit/theta/solver/z3/Z3SolverTest.java b/subprojects/solver/solver-z3/src/test/java/hu/bme/mit/theta/solver/z3/Z3SolverTest.java index 41dd4ec912..170a80a846 100644 --- a/subprojects/solver/solver-z3/src/test/java/hu/bme/mit/theta/solver/z3/Z3SolverTest.java +++ b/subprojects/solver/solver-z3/src/test/java/hu/bme/mit/theta/solver/z3/Z3SolverTest.java @@ -15,6 +15,19 @@ */ package hu.bme.mit.theta.solver.z3; +import static com.google.common.collect.ImmutableList.of; +import static hu.bme.mit.theta.core.decl.Decls.Const; +import static hu.bme.mit.theta.core.decl.Decls.Param; +import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.*; +import static hu.bme.mit.theta.core.type.booltype.BoolExprs.True; +import static hu.bme.mit.theta.core.type.bvtype.BvExprs.Bv; +import static hu.bme.mit.theta.core.type.bvtype.BvExprs.BvType; +import static hu.bme.mit.theta.core.type.functype.FuncExprs.App; +import static hu.bme.mit.theta.core.type.functype.FuncExprs.Func; +import static hu.bme.mit.theta.core.type.inttype.IntExprs.*; +import static hu.bme.mit.theta.core.type.inttype.IntExprs.Eq; +import static org.junit.Assert.*; + import hu.bme.mit.theta.core.decl.ConstDecl; import hu.bme.mit.theta.core.decl.ParamDecl; import hu.bme.mit.theta.core.model.ImmutableValuation; @@ -35,26 +48,12 @@ import hu.bme.mit.theta.solver.Solver; import hu.bme.mit.theta.solver.SolverStatus; import hu.bme.mit.theta.solver.UCSolver; -import kotlin.Pair; -import org.junit.Before; -import org.junit.Test; - import java.util.ArrayList; import java.util.List; import java.util.Optional; - -import static com.google.common.collect.ImmutableList.of; -import static hu.bme.mit.theta.core.decl.Decls.Const; -import static hu.bme.mit.theta.core.decl.Decls.Param; -import static hu.bme.mit.theta.core.type.arraytype.ArrayExprs.*; -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.True; -import static hu.bme.mit.theta.core.type.bvtype.BvExprs.Bv; -import static hu.bme.mit.theta.core.type.bvtype.BvExprs.BvType; -import static hu.bme.mit.theta.core.type.functype.FuncExprs.App; -import static hu.bme.mit.theta.core.type.functype.FuncExprs.Func; -import static hu.bme.mit.theta.core.type.inttype.IntExprs.*; -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Eq; -import static org.junit.Assert.*; +import kotlin.Pair; +import org.junit.Before; +import org.junit.Test; public final class Z3SolverTest { From a84d67fda76da623e16d9e568a40987abc51cfa4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Csan=C3=A1d=20Telbisz?= Date: Tue, 1 Jul 2025 11:53:18 +0200 Subject: [PATCH 39/48] fpfrombvexpr equals fix --- .../mit/theta/core/type/bvtype/BvLitExpr.kt | 9 ++++--- .../theta/core/type/fptype/FpFromBvExpr.kt | 24 +++++++++++++++++++ .../javasmt/JavaSMTTransformerTest.java | 23 ++++++++---------- 3 files changed, 38 insertions(+), 18 deletions(-) diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvLitExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvLitExpr.kt index 7344d3e83d..0aecec8c95 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvLitExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvLitExpr.kt @@ -358,16 +358,15 @@ data class BvLitExpr(val value: BooleanArray, val signed: Boolean? = null) : return result } - override fun equals(other: Any?): Boolean { + override fun equals(other: Any?): Boolean = if (this === other) { - return true + true } else if (other != null && this.javaClass == other.javaClass) { val that = other as BvLitExpr - return value.contentEquals(that.value) + value.contentEquals(that.value) } else { - return false + false } - } override fun toString(): String { val sb = StringBuilder() diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpFromBvExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpFromBvExpr.kt index a345c93d18..8a2495b45d 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpFromBvExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpFromBvExpr.kt @@ -24,6 +24,7 @@ import hu.bme.mit.theta.core.utils.BvUtils import hu.bme.mit.theta.core.utils.FpUtils import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable +import kotlinx.serialization.Transient import org.kframework.mpfr.BigFloat @Serializable @@ -52,6 +53,8 @@ data class FpFromBvExpr( ): FpFromBvExpr = of(roundingMode, op, fpType, signed) } + @Volatile @Transient private var hashCode = 0 + override val type: FpType get() = fpType @@ -83,4 +86,25 @@ data class FpFromBvExpr( "]") override fun toString(): String = super.toString() + + override fun hashCode(): Int { + var result = hashCode + if (result == 0) { + result = op.hashCode() + result = 31 * result + roundingMode.hashCode() + result = 31 * result + fpType.hashCode() + hashCode = result + } + return result + } + + override fun equals(other: Any?): Boolean = + if (this === other) { + true + } else if (other != null && this.javaClass == other.javaClass) { + val that = other as FpFromBvExpr + op == that.op && roundingMode == that.roundingMode && fpType == that.fpType + } else { + false + } } diff --git a/subprojects/solver/solver-javasmt/src/test/java/hu/bme/mit/theta/solver/javasmt/JavaSMTTransformerTest.java b/subprojects/solver/solver-javasmt/src/test/java/hu/bme/mit/theta/solver/javasmt/JavaSMTTransformerTest.java index aaa17c7570..691de74f5a 100644 --- a/subprojects/solver/solver-javasmt/src/test/java/hu/bme/mit/theta/solver/javasmt/JavaSMTTransformerTest.java +++ b/subprojects/solver/solver-javasmt/src/test/java/hu/bme/mit/theta/solver/javasmt/JavaSMTTransformerTest.java @@ -15,6 +15,11 @@ */ package hu.bme.mit.theta.solver.javasmt; +import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Not; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assume.assumeFalse; +import static org.junit.runners.Parameterized.Parameters; + import com.google.common.collect.Sets; import hu.bme.mit.theta.common.OsHelper; import hu.bme.mit.theta.common.OsHelper.OperatingSystem; @@ -31,6 +36,11 @@ import hu.bme.mit.theta.core.type.functype.FuncType; import hu.bme.mit.theta.core.type.rattype.RatType; import hu.bme.mit.theta.core.utils.ExpressionUtils; +import java.util.Collection; +import java.util.Set; +import java.util.function.BiFunction; +import java.util.function.Predicate; +import java.util.stream.Collectors; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; @@ -43,17 +53,6 @@ import org.sosy_lab.java_smt.SolverContextFactory.Solvers; import org.sosy_lab.java_smt.api.SolverContext; -import java.util.Collection; -import java.util.Set; -import java.util.function.BiFunction; -import java.util.function.Predicate; -import java.util.stream.Collectors; - -import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Not; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assume.assumeFalse; -import static org.junit.runners.Parameterized.Parameters; - @RunWith(Parameterized.class) public class JavaSMTTransformerTest { @@ -142,8 +141,6 @@ && hasExpr( final var expExpr = javaSMTTermTransformer.toExpr(expTerm); try { - System.err.println(expr); - System.err.println(expExpr); Assert.assertEquals(expr, expExpr); } catch (AssertionError e) { if (hasType(expr, type -> type instanceof FuncType)) { From e29cbd4bf094611f7e3c1558c47a256238a35f2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Csan=C3=A1d=20Telbisz?= Date: Tue, 1 Jul 2025 12:25:07 +0200 Subject: [PATCH 40/48] minor fix --- .../mit/theta/core/serialization/StmtSerializationTest.kt | 6 ++++-- .../src/main/java/hu/bme/mit/theta/xcfa/model/XcfaLabel.kt | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/subprojects/common/core/src/test/kotlin/hu/bme/mit/theta/core/serialization/StmtSerializationTest.kt b/subprojects/common/core/src/test/kotlin/hu/bme/mit/theta/core/serialization/StmtSerializationTest.kt index b8a6f96a9b..8be059c288 100644 --- a/subprojects/common/core/src/test/kotlin/hu/bme/mit/theta/core/serialization/StmtSerializationTest.kt +++ b/subprojects/common/core/src/test/kotlin/hu/bme/mit/theta/core/serialization/StmtSerializationTest.kt @@ -17,6 +17,8 @@ package hu.bme.mit.theta.core.serialization import hu.bme.mit.theta.core.decl.Decls import hu.bme.mit.theta.core.stmt.* +import hu.bme.mit.theta.core.stmt.Stmts.NonDet +import hu.bme.mit.theta.core.stmt.Stmts.Sequence import hu.bme.mit.theta.core.type.anytype.Dereference import hu.bme.mit.theta.core.type.inttype.IntExprs.Eq import hu.bme.mit.theta.core.type.inttype.IntExprs.Int @@ -99,7 +101,7 @@ class StmtSerializationTest { val s1 = AssignStmt(Decls.Var("x", Int()), Int(1)) val s2 = AssignStmt(Decls.Var("y", Int()), Int(2)) val s3 = SkipStmt - val original: Stmt = NonDetStmt(listOf(s1, s2, s3)) + val original: Stmt = NonDet(listOf(s1, s2, s3)) val serialized = json.encodeToString(original) val deserialized = json.decodeFromString(serialized) assertEquals(original, deserialized) @@ -121,7 +123,7 @@ class StmtSerializationTest { val s1 = AssignStmt(Decls.Var("x", Int()), Int(1)) val s2 = AssignStmt(Decls.Var("y", Int()), Int(2)) val s3 = SkipStmt - val original: Stmt = SequenceStmt(listOf(s1, s2, s3)) + val original: Stmt = Sequence(listOf(s1, s2, s3)) val serialized = json.encodeToString(original) val deserialized = json.decodeFromString(serialized) assertEquals(original, deserialized) diff --git a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/model/XcfaLabel.kt b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/model/XcfaLabel.kt index b0714c16ec..a8d8ed1ab4 100644 --- a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/model/XcfaLabel.kt +++ b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/model/XcfaLabel.kt @@ -21,6 +21,8 @@ import hu.bme.mit.theta.core.decl.VarDecl import hu.bme.mit.theta.core.stmt.NonDetStmt import hu.bme.mit.theta.core.stmt.SequenceStmt import hu.bme.mit.theta.core.stmt.Stmt +import hu.bme.mit.theta.core.stmt.Stmts.NonDet +import hu.bme.mit.theta.core.stmt.Stmts.Sequence import hu.bme.mit.theta.core.stmt.Stmts.Skip import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.grammar.dsl.expr.ExpressionWrapper @@ -216,7 +218,7 @@ constructor(val labels: List, override val metadata: MetaData = Empty XcfaLabel(metadata = metadata) { override fun toStmt(): Stmt { - return SequenceStmt(labels.map { it.toStmt() }) + return Sequence(labels.map { it.toStmt() }) } override fun toString(): String { @@ -232,7 +234,7 @@ constructor(val labels: Set, override val metadata: MetaData = EmptyM XcfaLabel(metadata = metadata) { override fun toStmt(): Stmt { - return NonDetStmt(labels.map { it.toStmt() }) + return NonDet(labels.map { it.toStmt() }) } override fun toString(): String { From b2a2102c43ba1ef26417955ca1314a5d2501e5c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Csan=C3=A1d=20Telbisz?= Date: Tue, 1 Jul 2025 12:25:35 +0200 Subject: [PATCH 41/48] retire windows-2019 --- .github/workflows/win-build-test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/win-build-test.yml b/.github/workflows/win-build-test.yml index 7fc33a46f5..3ff296b412 100644 --- a/.github/workflows/win-build-test.yml +++ b/.github/workflows/win-build-test.yml @@ -15,7 +15,7 @@ jobs: strategy: fail-fast: false matrix: - os: [windows-latest, windows-2019, windows-2022] + os: [windows-latest, windows-2022] runs-on: ${{ matrix.os }} steps: - name: Checkout repository From 9dd6cded837ea086c12c8eb6385761c35d38b570 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Csan=C3=A1d=20Telbisz?= Date: Tue, 1 Jul 2025 12:49:02 +0200 Subject: [PATCH 42/48] fix xsts var changer test --- .../hu/bme/mit/theta/xsts/utils/XSTSVarChangerUnitTest.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subprojects/xsts/xsts/src/test/kotlin/hu/bme/mit/theta/xsts/utils/XSTSVarChangerUnitTest.kt b/subprojects/xsts/xsts/src/test/kotlin/hu/bme/mit/theta/xsts/utils/XSTSVarChangerUnitTest.kt index 5adfecb178..c2c60d2e18 100644 --- a/subprojects/xsts/xsts/src/test/kotlin/hu/bme/mit/theta/xsts/utils/XSTSVarChangerUnitTest.kt +++ b/subprojects/xsts/xsts/src/test/kotlin/hu/bme/mit/theta/xsts/utils/XSTSVarChangerUnitTest.kt @@ -48,6 +48,6 @@ class XSTSVarChangerUnitTest { StmtUtils.getVars(newXsts.env), ) - assert(!newVars.any { origVars.contains(it) }) + assert(!newVars.any { new -> origVars.any { old -> new === old } }) } } From a2891ab2b96b877659571839ffac9b3b6689011b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Csan=C3=A1d=20Telbisz?= Date: Tue, 1 Jul 2025 13:28:41 +0200 Subject: [PATCH 43/48] decl equals based on reference --- .../main/kotlin/hu/bme/mit/theta/core/decl/BasicConstDecl.kt | 2 ++ .../core/src/main/kotlin/hu/bme/mit/theta/core/decl/Decl.kt | 2 ++ .../main/kotlin/hu/bme/mit/theta/core/decl/IndexedConstDecl.kt | 2 ++ .../src/main/kotlin/hu/bme/mit/theta/core/decl/ParamDecl.kt | 2 ++ .../core/src/main/kotlin/hu/bme/mit/theta/core/decl/VarDecl.kt | 2 ++ 5 files changed, 10 insertions(+) diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/BasicConstDecl.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/BasicConstDecl.kt index a4bd8b7f1b..5263ddf9ab 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/BasicConstDecl.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/BasicConstDecl.kt @@ -35,6 +35,8 @@ import kotlinx.serialization.encoding.* data class BasicConstDecl(override val name: String, override val type: DeclType) : ConstDecl() { + override fun equals(other: Any?): Boolean = super.equals(other) + object Serializer : KSerializer> { override val descriptor: SerialDescriptor = diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/Decl.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/Decl.kt index b0fea5542f..39f153c943 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/Decl.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/Decl.kt @@ -27,4 +27,6 @@ abstract class Decl { abstract val type: DeclType val ref: RefExpr by lazy { Ref(this) } + + override fun equals(other: Any?): Boolean = this === other } diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/IndexedConstDecl.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/IndexedConstDecl.kt index 6d5f5bbf07..dfdd501f5e 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/IndexedConstDecl.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/IndexedConstDecl.kt @@ -45,6 +45,8 @@ data class IndexedConstDecl(val varDecl: VarDecl, val override val name: String = String.format(NAME_FORMAT, varDecl.name, index) override val type: DeclType = varDecl.type + override fun equals(other: Any?): Boolean = super.equals(other) + object Serializer : KSerializer> { override val descriptor: SerialDescriptor = diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/ParamDecl.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/ParamDecl.kt index f1a3a6407d..d2eb7ce0aa 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/ParamDecl.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/ParamDecl.kt @@ -39,6 +39,8 @@ data class ParamDecl(override val name: String, override val ty override fun toString(): String = Utils.lispStringBuilder(DECL_LABEL).add(name).add(type).toString() + override fun equals(other: Any?): Boolean = super.equals(other) + object Serializer : KSerializer> { override val descriptor: SerialDescriptor = diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/VarDecl.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/VarDecl.kt index db2b97c0b2..5bd5b48f87 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/VarDecl.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/VarDecl.kt @@ -52,6 +52,8 @@ data class VarDecl(override val name: String, override val type override fun toString(): String = Utils.lispStringBuilder(DECL_LABEL).add(name).add(type).toString() + override fun equals(other: Any?): Boolean = super.equals(other) + object Serializer : KSerializer> { override val descriptor: SerialDescriptor = From d06b9a8600fcd30dfeb5a9c2386fa80aa83d8ded Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Csan=C3=A1d=20Telbisz?= Date: Tue, 1 Jul 2025 14:12:20 +0200 Subject: [PATCH 44/48] fixing duplicate var tests --- .../cfa/cfa/src/test/java/hu/bme/mit/theta/cfa/CfaTest.java | 2 +- .../test/kotlin/hu/bme/mit/theta/cfa/CFAVarChangerUnitTest.kt | 4 ++-- .../hu/bme/mit/theta/xsts/utils/XSTSVarChangerUnitTest.kt | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/subprojects/cfa/cfa/src/test/java/hu/bme/mit/theta/cfa/CfaTest.java b/subprojects/cfa/cfa/src/test/java/hu/bme/mit/theta/cfa/CfaTest.java index 2559931d24..ff9afe7e73 100644 --- a/subprojects/cfa/cfa/src/test/java/hu/bme/mit/theta/cfa/CfaTest.java +++ b/subprojects/cfa/cfa/src/test/java/hu/bme/mit/theta/cfa/CfaTest.java @@ -34,7 +34,7 @@ public void testDuplicateLocationName() { builder.createLoc("A"); } - @Test + @Test(expected = IllegalArgumentException.class) public void testDuplicateVarName() { CFA.Builder builder = CFA.builder(); VarDecl v1 = Decls.Var("x", IntExprs.Int()); diff --git a/subprojects/cfa/cfa/src/test/kotlin/hu/bme/mit/theta/cfa/CFAVarChangerUnitTest.kt b/subprojects/cfa/cfa/src/test/kotlin/hu/bme/mit/theta/cfa/CFAVarChangerUnitTest.kt index e4f4848791..a1afedb744 100644 --- a/subprojects/cfa/cfa/src/test/kotlin/hu/bme/mit/theta/cfa/CFAVarChangerUnitTest.kt +++ b/subprojects/cfa/cfa/src/test/kotlin/hu/bme/mit/theta/cfa/CFAVarChangerUnitTest.kt @@ -32,7 +32,7 @@ class CFAVarChangerUnitTest { val newVar = Decls.Var("x", IntType.getInstance()) val newCfa = origCfa.copyWithReplacingVars(listOf(newVar).associateBy { it.name }) - assert(!newCfa.vars.any { new -> origCfa.vars.any { old -> new === old } }) - assert(origCfa.vars.first() !== newCfa.vars.first()) + assert(!newCfa.vars.any { it in origCfa.vars }) + assert(origCfa.vars.first() != newCfa.vars.first()) } } diff --git a/subprojects/xsts/xsts/src/test/kotlin/hu/bme/mit/theta/xsts/utils/XSTSVarChangerUnitTest.kt b/subprojects/xsts/xsts/src/test/kotlin/hu/bme/mit/theta/xsts/utils/XSTSVarChangerUnitTest.kt index c2c60d2e18..11e2ec5ce8 100644 --- a/subprojects/xsts/xsts/src/test/kotlin/hu/bme/mit/theta/xsts/utils/XSTSVarChangerUnitTest.kt +++ b/subprojects/xsts/xsts/src/test/kotlin/hu/bme/mit/theta/xsts/utils/XSTSVarChangerUnitTest.kt @@ -48,6 +48,6 @@ class XSTSVarChangerUnitTest { StmtUtils.getVars(newXsts.env), ) - assert(!newVars.any { new -> origVars.any { old -> new === old } }) + assert(!newVars.any { it in origVars }) } } From ff8c17b9d205cf17bf97168ac9772c7d11f3b562 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Csan=C3=A1d=20Telbisz?= Date: Tue, 1 Jul 2025 15:20:31 +0200 Subject: [PATCH 45/48] variables with indexes --- .../bme/mit/theta/core/decl/BasicConstDecl.kt | 24 +++++++++++++---- .../kotlin/hu/bme/mit/theta/core/decl/Decl.kt | 11 ++++++-- .../mit/theta/core/decl/IndexedConstDecl.kt | 19 ++++++++++--- .../hu/bme/mit/theta/core/decl/ParamDecl.kt | 24 ++++++++++++----- .../hu/bme/mit/theta/core/decl/VarDecl.kt | 24 ++++++++++++----- .../mit/theta/core/utils/UniqueIdProvider.kt | 27 +++++++++++++++++++ 6 files changed, 106 insertions(+), 23 deletions(-) create mode 100644 subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/utils/UniqueIdProvider.kt diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/BasicConstDecl.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/BasicConstDecl.kt index 5263ddf9ab..9f0c5642f3 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/BasicConstDecl.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/BasicConstDecl.kt @@ -16,6 +16,7 @@ package hu.bme.mit.theta.core.decl import hu.bme.mit.theta.core.type.Type +import hu.bme.mit.theta.core.utils.UniqueIdProvider import kotlinx.serialization.KSerializer import kotlinx.serialization.PolymorphicSerializer import kotlinx.serialization.SerialName @@ -32,40 +33,53 @@ import kotlinx.serialization.encoding.* */ @Serializable(with = BasicConstDecl.Serializer::class) @SerialName("BasicConstDecl") -data class BasicConstDecl(override val name: String, override val type: DeclType) : - ConstDecl() { +data class BasicConstDecl( + override val name: String, + override val type: DeclType, + override val id: Int = uniqueIdProvider.get(), +) : ConstDecl() { - override fun equals(other: Any?): Boolean = super.equals(other) + companion object { + private val uniqueIdProvider = UniqueIdProvider() + } object Serializer : KSerializer> { override val descriptor: SerialDescriptor = buildClassSerialDescriptor("BasicConstDecl") { element("name") - element("type") + element("type") + element("id") } override fun serialize(encoder: Encoder, value: BasicConstDecl) = encoder.encodeStructure(descriptor) { encodeStringElement(descriptor, 0, value.name) encodeSerializableElement(descriptor, 1, PolymorphicSerializer(Type::class), value.type) + encodeIntElement(descriptor, 2, value.id) } override fun deserialize(decoder: Decoder): BasicConstDecl = decoder.decodeStructure(descriptor) { var name: String? = null var type: Type? = null + var id: Int? = null while (true) { when (val index = decodeElementIndex(descriptor)) { 0 -> name = decodeStringElement(descriptor, 0) 1 -> type = decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Type::class)) + 2 -> id = decodeIntElement(descriptor, 2) CompositeDecoder.DECODE_DONE -> break else -> error("Unexpected index: $index") } } - BasicConstDecl(name = name ?: error("Missing name"), type = type ?: error("Missing type")) + BasicConstDecl( + name = name ?: error("Missing name"), + type = type ?: error("Missing type"), + id = id ?: error("Missing id"), + ) } } } diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/Decl.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/Decl.kt index 39f153c943..9559e7b576 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/Decl.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/Decl.kt @@ -23,10 +23,17 @@ import kotlinx.serialization.Serializable @Serializable abstract class Decl { + /** The name of the declaration. */ abstract val name: String + + /** The type of the declaration. */ abstract val type: DeclType - val ref: RefExpr by lazy { Ref(this) } + /** + * Unique identifier for the declaration used for serialization. Do not use for other purposes! + */ + protected abstract val id: Int - override fun equals(other: Any?): Boolean = this === other + /** Reference to this declaration. */ + val ref: RefExpr by lazy { Ref(this) } } diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/IndexedConstDecl.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/IndexedConstDecl.kt index dfdd501f5e..59ec5ebe97 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/IndexedConstDecl.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/IndexedConstDecl.kt @@ -16,6 +16,7 @@ package hu.bme.mit.theta.core.decl import hu.bme.mit.theta.core.type.Type +import hu.bme.mit.theta.core.utils.UniqueIdProvider import kotlinx.serialization.* import kotlinx.serialization.descriptors.SerialDescriptor import kotlinx.serialization.descriptors.buildClassSerialDescriptor @@ -30,8 +31,11 @@ import kotlinx.serialization.encoding.* */ @Serializable(with = IndexedConstDecl.Serializer::class) @SerialName("IndexedConstDecl") -data class IndexedConstDecl(val varDecl: VarDecl, val index: Int) : - ConstDecl() { +data class IndexedConstDecl( + val varDecl: VarDecl, + val index: Int, + override val id: Int = uniqueIdProvider.get(), +) : ConstDecl() { init { require(index >= 0) { "Index must be non-negative" } @@ -39,43 +43,50 @@ data class IndexedConstDecl(val varDecl: VarDecl, val companion object { + private val uniqueIdProvider = UniqueIdProvider() + private const val NAME_FORMAT: String = "_%s:%d" } override val name: String = String.format(NAME_FORMAT, varDecl.name, index) override val type: DeclType = varDecl.type - override fun equals(other: Any?): Boolean = super.equals(other) - object Serializer : KSerializer> { override val descriptor: SerialDescriptor = buildClassSerialDescriptor("IndexedConstDecl") { element>("varDecl") element("index") + element("id") } override fun serialize(encoder: Encoder, value: IndexedConstDecl) = encoder.encodeStructure(descriptor) { encodeSerializableElement(descriptor, 0, VarDecl.Serializer, value.varDecl) encodeIntElement(descriptor, 1, value.index) + encodeIntElement(descriptor, 2, value.id) } override fun deserialize(decoder: Decoder): IndexedConstDecl = decoder.decodeStructure(descriptor) { var varDecl: VarDecl? = null var index: Int? = null + var id: Int? = null + while (true) { when (val i = decodeElementIndex(descriptor)) { 0 -> varDecl = decodeSerializableElement(descriptor, 0, VarDecl.Serializer) 1 -> index = decodeIntElement(descriptor, 1) + 2 -> id = decodeIntElement(descriptor, 2) CompositeDecoder.DECODE_DONE -> break else -> throw SerializationException("Unknown index $i") } } + IndexedConstDecl( varDecl = varDecl ?: error("Missing varDecl"), index = index ?: error("Missing index"), + id = id ?: error("Missing id"), ) } } diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/ParamDecl.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/ParamDecl.kt index d2eb7ce0aa..5ba767d47b 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/ParamDecl.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/ParamDecl.kt @@ -17,6 +17,7 @@ package hu.bme.mit.theta.core.decl import hu.bme.mit.theta.common.Utils import hu.bme.mit.theta.core.type.Type +import hu.bme.mit.theta.core.utils.UniqueIdProvider import kotlinx.serialization.KSerializer import kotlinx.serialization.PolymorphicSerializer import kotlinx.serialization.SerialName @@ -28,48 +29,59 @@ import kotlinx.serialization.encoding.* @Serializable(with = ParamDecl.Serializer::class) @SerialName(ParamDecl.DECL_LABEL) -data class ParamDecl(override val name: String, override val type: DeclType) : - Decl() { +data class ParamDecl( + override val name: String, + override val type: DeclType, + override val id: Int = uniqueIdProvider.get(), +) : Decl() { companion object { + private val uniqueIdProvider = UniqueIdProvider() + internal const val DECL_LABEL: String = "Param" } override fun toString(): String = Utils.lispStringBuilder(DECL_LABEL).add(name).add(type).toString() - override fun equals(other: Any?): Boolean = super.equals(other) - object Serializer : KSerializer> { override val descriptor: SerialDescriptor = buildClassSerialDescriptor("ParamDecl") { element("name") - element("type") + element("type") + element("id") } override fun serialize(encoder: Encoder, value: ParamDecl) = encoder.encodeStructure(descriptor) { encodeStringElement(descriptor, 0, value.name) encodeSerializableElement(descriptor, 1, PolymorphicSerializer(Type::class), value.type) + encodeIntElement(descriptor, 2, value.id) } override fun deserialize(decoder: Decoder): ParamDecl = decoder.decodeStructure(descriptor) { var name: String? = null var type: Type? = null + var id: Int? = null while (true) { when (val index = decodeElementIndex(descriptor)) { 0 -> name = decodeStringElement(descriptor, 0) 1 -> type = decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Type::class)) + 2 -> id = decodeIntElement(descriptor, 2) CompositeDecoder.DECODE_DONE -> break else -> error("Unexpected index: $index") } } - ParamDecl(name = name ?: error("Missing name"), type = type ?: error("Missing type")) + ParamDecl( + name = name ?: error("Missing name"), + type = type ?: error("Missing type"), + id = id ?: error("Missing id"), + ) } } } diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/VarDecl.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/VarDecl.kt index 5bd5b48f87..18edec5c4b 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/VarDecl.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/VarDecl.kt @@ -17,6 +17,7 @@ package hu.bme.mit.theta.core.decl import hu.bme.mit.theta.common.Utils import hu.bme.mit.theta.core.type.Type +import hu.bme.mit.theta.core.utils.UniqueIdProvider import kotlinx.serialization.* import kotlinx.serialization.descriptors.SerialDescriptor import kotlinx.serialization.descriptors.buildClassSerialDescriptor @@ -32,11 +33,16 @@ import kotlinx.serialization.encoding.* */ @Serializable(with = VarDecl.Serializer::class) @SerialName(VarDecl.DECL_LABEL) -data class VarDecl(override val name: String, override val type: DeclType) : - Decl() { +data class VarDecl( + override val name: String, + override val type: DeclType, + override val id: Int = uniqueIdProvider.get(), +) : Decl() { companion object { + private val uniqueIdProvider = UniqueIdProvider() + internal const val DECL_LABEL: String = "var" fun copyOf(from: VarDecl): VarDecl = VarDecl(from.name, from.type) @@ -52,37 +58,43 @@ data class VarDecl(override val name: String, override val type override fun toString(): String = Utils.lispStringBuilder(DECL_LABEL).add(name).add(type).toString() - override fun equals(other: Any?): Boolean = super.equals(other) - object Serializer : KSerializer> { override val descriptor: SerialDescriptor = buildClassSerialDescriptor("VarDecl") { element("name") - element("type") + element("type") + element("id") } override fun serialize(encoder: Encoder, value: VarDecl) = encoder.encodeStructure(descriptor) { encodeStringElement(descriptor, 0, value.name) encodeSerializableElement(descriptor, 1, PolymorphicSerializer(Type::class), value.type) + encodeIntElement(descriptor, 2, value.id) } override fun deserialize(decoder: Decoder): VarDecl = decoder.decodeStructure(descriptor) { var name: String? = null var type: Type? = null + var id: Int? = null while (true) { when (val index = decodeElementIndex(descriptor)) { 0 -> name = decodeStringElement(descriptor, 0) 1 -> type = decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Type::class)) + 2 -> id = decodeIntElement(descriptor, 2) CompositeDecoder.DECODE_DONE -> break else -> error("Unexpected index: $index") } } - VarDecl(name = name ?: error("Missing name"), type = type ?: error("Missing type")) + VarDecl( + name = name ?: error("Missing name"), + type = type ?: error("Missing type"), + id = id ?: error("Missing id"), + ) } } } diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/utils/UniqueIdProvider.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/utils/UniqueIdProvider.kt new file mode 100644 index 0000000000..9931791000 --- /dev/null +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/utils/UniqueIdProvider.kt @@ -0,0 +1,27 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.core.utils + +class UniqueIdProvider { + private var currentId = 0 + + /** + * Returns a unique identifier. + * + * @return A unique integer identifier + */ + fun get(): Int = currentId++ +} From a51cf34c43bb1439486b1d95d15e4a97781d7af1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Csan=C3=A1d=20Telbisz?= Date: Tue, 1 Jul 2025 16:32:31 +0200 Subject: [PATCH 46/48] serializable expressions in xcfa --- .../frontends/c-frontend/build.gradle.kts | 2 + .../grammar/expression/SerializerModule.kt | 33 ++++++++++ .../expression/UnsupportedInitializer.java | 43 ------------- .../expression/UnsupportedInitializerExpr.kt | 42 +++++++++++++ .../grammar/type/DeclarationVisitor.java | 5 +- .../mit/theta/c2xcfa/FrontendXcfaBuilder.kt | 4 +- subprojects/xcfa/xcfa/build.gradle.kts | 2 + .../hu/bme/mit/theta/xcfa/MallocLitExpr.kt | 63 +++++++++++++++++++ .../hu/bme/mit/theta/xcfa/SerializerModule.kt | 32 ++++++++++ .../main/java/hu/bme/mit/theta/xcfa/Utils.kt | 9 --- .../bme/mit/theta/xcfa/MallocLitExprTest.kt | 36 +++++++++++ 11 files changed, 215 insertions(+), 56 deletions(-) create mode 100644 subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/grammar/expression/SerializerModule.kt delete mode 100644 subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/grammar/expression/UnsupportedInitializer.java create mode 100644 subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/grammar/expression/UnsupportedInitializerExpr.kt create mode 100644 subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/MallocLitExpr.kt create mode 100644 subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/SerializerModule.kt create mode 100644 subprojects/xcfa/xcfa/src/test/java/hu/bme/mit/theta/xcfa/MallocLitExprTest.kt diff --git a/subprojects/frontends/c-frontend/build.gradle.kts b/subprojects/frontends/c-frontend/build.gradle.kts index 1f8376de5f..603f5d73aa 100644 --- a/subprojects/frontends/c-frontend/build.gradle.kts +++ b/subprojects/frontends/c-frontend/build.gradle.kts @@ -16,9 +16,11 @@ plugins { id("kotlin-common") id("antlr-grammar") + id("kotlinx-serialization") } dependencies { implementation(project(":theta-core")) implementation(project(":theta-common")) implementation(project(":theta-grammar")) + implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.3") } diff --git a/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/grammar/expression/SerializerModule.kt b/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/grammar/expression/SerializerModule.kt new file mode 100644 index 0000000000..25b521fe54 --- /dev/null +++ b/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/grammar/expression/SerializerModule.kt @@ -0,0 +1,33 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.frontend.transformation.grammar.expression + +import hu.bme.mit.theta.core.serialization.coreSerializerModule +import hu.bme.mit.theta.core.type.Expr +import kotlinx.serialization.json.Json +import kotlinx.serialization.modules.SerializersModule +import kotlinx.serialization.modules.polymorphic +import kotlinx.serialization.modules.subclass + +val frontendSerializerModule = SerializersModule { + include(coreSerializerModule) + polymorphic(Expr::class) { subclass(UnsupportedInitializerExpr::class) } +} + +val frontendJson = Json { + serializersModule = frontendSerializerModule + classDiscriminator = "class" +} diff --git a/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/grammar/expression/UnsupportedInitializer.java b/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/grammar/expression/UnsupportedInitializer.java deleted file mode 100644 index b623c4f9d4..0000000000 --- a/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/grammar/expression/UnsupportedInitializer.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright 2025 Budapest University of Technology and Economics - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package hu.bme.mit.theta.frontend.transformation.grammar.expression; - -import static hu.bme.mit.theta.core.type.inttype.IntExprs.Int; - -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.core.type.LitExpr; -import hu.bme.mit.theta.core.type.NullaryExpr; -import hu.bme.mit.theta.core.type.inttype.IntType; -import hu.bme.mit.theta.frontend.UnsupportedFrontendElementException; - -public class UnsupportedInitializer extends NullaryExpr { - - @Override - public IntType getType() { - return Int(); - } - - @Override - public LitExpr eval(Valuation val) { - throw new UnsupportedFrontendElementException( - "UnsupportedInitializer expressions are not supported."); - } - - @Override - public String toString() { - return "UnsupportedInitializer"; - } -} diff --git a/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/grammar/expression/UnsupportedInitializerExpr.kt b/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/grammar/expression/UnsupportedInitializerExpr.kt new file mode 100644 index 0000000000..61d6289072 --- /dev/null +++ b/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/grammar/expression/UnsupportedInitializerExpr.kt @@ -0,0 +1,42 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.frontend.transformation.grammar.expression + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.type.NullaryExpr +import hu.bme.mit.theta.core.type.inttype.IntExprs.Int +import hu.bme.mit.theta.core.type.inttype.IntType +import hu.bme.mit.theta.frontend.UnsupportedFrontendElementException +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +@SerialName("UnsupportedInitializer") +data object UnsupportedInitializerExpr : NullaryExpr() { + + override val type: IntType + get() = Int() + + override fun eval(`val`: Valuation): LitExpr = + throw UnsupportedFrontendElementException( + "UnsupportedInitializer expressions are not supported." + ) + + override fun toString(): String = "UnsupportedInitializer" + + @JvmStatic fun getInstance(): UnsupportedInitializerExpr = this +} diff --git a/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/grammar/type/DeclarationVisitor.java b/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/grammar/type/DeclarationVisitor.java index f9286e488e..d41863fbe6 100644 --- a/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/grammar/type/DeclarationVisitor.java +++ b/subprojects/frontends/c-frontend/src/main/java/hu/bme/mit/theta/frontend/transformation/grammar/type/DeclarationVisitor.java @@ -24,7 +24,7 @@ import hu.bme.mit.theta.core.type.Expr; import hu.bme.mit.theta.frontend.ParseContext; import hu.bme.mit.theta.frontend.UnsupportedFrontendElementException; -import hu.bme.mit.theta.frontend.transformation.grammar.expression.UnsupportedInitializer; +import hu.bme.mit.theta.frontend.transformation.grammar.expression.UnsupportedInitializerExpr; import hu.bme.mit.theta.frontend.transformation.grammar.function.FunctionVisitor; import hu.bme.mit.theta.frontend.transformation.grammar.preprocess.TypedefVisitor; import hu.bme.mit.theta.frontend.transformation.model.declaration.CDeclaration; @@ -117,7 +117,8 @@ public List getDeclarations( initializerExpression = cInitializerList; } catch (NullPointerException e) { initializerExpression = - new CExpr(new UnsupportedInitializer(), parseContext); + new CExpr( + UnsupportedInitializerExpr.getInstance(), parseContext); parseContext .getMetadata() .create( diff --git a/subprojects/xcfa/c2xcfa/src/main/java/hu/bme/mit/theta/c2xcfa/FrontendXcfaBuilder.kt b/subprojects/xcfa/c2xcfa/src/main/java/hu/bme/mit/theta/c2xcfa/FrontendXcfaBuilder.kt index 02e75fa913..29d818fa8a 100644 --- a/subprojects/xcfa/c2xcfa/src/main/java/hu/bme/mit/theta/c2xcfa/FrontendXcfaBuilder.kt +++ b/subprojects/xcfa/c2xcfa/src/main/java/hu/bme/mit/theta/c2xcfa/FrontendXcfaBuilder.kt @@ -46,7 +46,7 @@ import hu.bme.mit.theta.core.utils.ExprUtils import hu.bme.mit.theta.core.utils.TypeUtils.cast import hu.bme.mit.theta.frontend.ParseContext import hu.bme.mit.theta.frontend.UnsupportedFrontendElementException -import hu.bme.mit.theta.frontend.transformation.grammar.expression.UnsupportedInitializer +import hu.bme.mit.theta.frontend.transformation.grammar.expression.UnsupportedInitializerExpr import hu.bme.mit.theta.frontend.transformation.model.statements.* import hu.bme.mit.theta.frontend.transformation.model.types.complex.CComplexType import hu.bme.mit.theta.frontend.transformation.model.types.complex.CVoid @@ -166,7 +166,7 @@ class FrontendXcfaBuilder( } else { if ( globalDeclaration.get1().initExpr != null && - globalDeclaration.get1().initExpr.expression !is UnsupportedInitializer + globalDeclaration.get1().initExpr.expression !is UnsupportedInitializerExpr ) { initStmtList.add( StmtLabel( diff --git a/subprojects/xcfa/xcfa/build.gradle.kts b/subprojects/xcfa/xcfa/build.gradle.kts index bec2ccd84a..ea2e8d65e5 100644 --- a/subprojects/xcfa/xcfa/build.gradle.kts +++ b/subprojects/xcfa/xcfa/build.gradle.kts @@ -16,9 +16,11 @@ plugins { id("kotlin-common") id("kaml-serialization") + id("kotlinx-serialization") } dependencies { + implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.3") implementation(project(":theta-common")) implementation(project(":theta-core")) implementation(project(":theta-grammar")) diff --git a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/MallocLitExpr.kt b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/MallocLitExpr.kt new file mode 100644 index 0000000000..17d408cae1 --- /dev/null +++ b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/MallocLitExpr.kt @@ -0,0 +1,63 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.xcfa + +import hu.bme.mit.theta.core.model.Valuation +import hu.bme.mit.theta.core.type.LitExpr +import hu.bme.mit.theta.core.type.NullaryExpr +import hu.bme.mit.theta.core.type.Type +import kotlinx.serialization.* +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.descriptors.buildClassSerialDescriptor +import kotlinx.serialization.descriptors.element +import kotlinx.serialization.encoding.* + +@Serializable(with = MallocLitExpr.Serializer::class) +@SerialName("MallocLit") +data class MallocLitExpr(val kType: T) : NullaryExpr(), LitExpr { + + override val type: T + get() = kType + + override fun eval(`val`: Valuation): LitExpr = this + + object Serializer : KSerializer> { + + override val descriptor: SerialDescriptor = + buildClassSerialDescriptor("MallocLit") { element("kType") } + + override fun serialize(encoder: Encoder, value: MallocLitExpr) = + encoder.encodeStructure(descriptor) { + encodeSerializableElement(descriptor, 0, PolymorphicSerializer(Type::class), value.kType) + } + + override fun deserialize(decoder: Decoder): MallocLitExpr = + decoder.decodeStructure(descriptor) { + var kType: Type? = null + + while (true) { + when (val i = decodeElementIndex(descriptor)) { + 0 -> + kType = decodeSerializableElement(descriptor, 0, PolymorphicSerializer(Type::class)) + + CompositeDecoder.DECODE_DONE -> break + else -> throw SerializationException("Unknown index $i") + } + } + MallocLitExpr(kType = kType ?: throw SerializationException("Missing kType")) + } + } +} diff --git a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/SerializerModule.kt b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/SerializerModule.kt new file mode 100644 index 0000000000..4c8e2a963f --- /dev/null +++ b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/SerializerModule.kt @@ -0,0 +1,32 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.xcfa + +import hu.bme.mit.theta.core.serialization.coreSerializerModule +import hu.bme.mit.theta.core.type.Expr +import kotlinx.serialization.json.Json +import kotlinx.serialization.modules.SerializersModule +import kotlinx.serialization.modules.polymorphic + +val xcfaSerializerModule = SerializersModule { + include(coreSerializerModule) + polymorphic(Expr::class) { subclass(MallocLitExpr::class, MallocLitExpr.Serializer) } +} + +val xcfaJson = Json { + serializersModule = xcfaSerializerModule + classDiscriminator = "class" +} diff --git a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/Utils.kt b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/Utils.kt index ac5efeb5b0..18ab59e0ce 100644 --- a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/Utils.kt +++ b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/Utils.kt @@ -22,12 +22,10 @@ import hu.bme.mit.theta.common.dsl.Symbol import hu.bme.mit.theta.common.dsl.SymbolTable import hu.bme.mit.theta.core.decl.VarDecl import hu.bme.mit.theta.core.model.MutableValuation -import hu.bme.mit.theta.core.model.Valuation import hu.bme.mit.theta.core.stmt.* import hu.bme.mit.theta.core.stmt.Stmts.Assign import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.LitExpr -import hu.bme.mit.theta.core.type.NullaryExpr import hu.bme.mit.theta.core.type.Type import hu.bme.mit.theta.core.type.abstracttype.ModExpr import hu.bme.mit.theta.core.type.abstracttype.NeqExpr @@ -550,13 +548,6 @@ fun XcfaLabel.simplify(valuation: MutableValuation, parseContext: ParseContext): } } else this -data class MallocLitExpr(val kType: T) : NullaryExpr(), LitExpr { - - override val type: T = kType - - override fun eval(`val`: Valuation): LitExpr = this -} - val XCFA.lazyPointsToGraph: Lazy, Set>>> get() = lazy { val attempt = diff --git a/subprojects/xcfa/xcfa/src/test/java/hu/bme/mit/theta/xcfa/MallocLitExprTest.kt b/subprojects/xcfa/xcfa/src/test/java/hu/bme/mit/theta/xcfa/MallocLitExprTest.kt new file mode 100644 index 0000000000..169495315c --- /dev/null +++ b/subprojects/xcfa/xcfa/src/test/java/hu/bme/mit/theta/xcfa/MallocLitExprTest.kt @@ -0,0 +1,36 @@ +/* + * Copyright 2025 Budapest University of Technology and Economics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package hu.bme.mit.theta.xcfa + +import hu.bme.mit.theta.core.type.Expr +import hu.bme.mit.theta.core.type.Type +import hu.bme.mit.theta.core.type.inttype.IntExprs.Int +import kotlinx.serialization.encodeToString +import org.junit.Assert.assertEquals +import org.junit.Test +import org.junit.jupiter.api.assertDoesNotThrow + +class MallocLitExprTest { + + @Test + fun `test malloc literal expression serialization`() { + val mallocLitExpr = MallocLitExpr(Int()) + val serialized = xcfaJson.encodeToString>(mallocLitExpr) + val deserialized = xcfaJson.decodeFromString>(serialized) + assertEquals(mallocLitExpr, deserialized) + assertDoesNotThrow { (deserialized as MallocLitExpr<*>).kType } + } +} From 3adb96151ccb2541417f2104ebced4d18993c00a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Csan=C3=A1d=20Telbisz?= Date: Fri, 18 Jul 2025 12:16:00 +0200 Subject: [PATCH 47/48] fixing imports in new files --- .../algorithm/bounded/AbstractMonolithicExpr.kt | 5 +++-- .../hu/bme/mit/theta/core/decl/BasicConstDecl.kt | 13 +++++-------- .../hu/bme/mit/theta/core/decl/IndexedConstDecl.kt | 6 +++--- .../kotlin/hu/bme/mit/theta/core/decl/ParamDecl.kt | 13 +++++-------- .../kotlin/hu/bme/mit/theta/core/decl/VarDecl.kt | 8 ++++---- .../mit/theta/core/type/arraytype/ArrayLitExpr.kt | 13 +++++-------- .../bme/mit/theta/core/type/arraytype/ArrayType.kt | 11 ++++------- .../hu/bme/mit/theta/core/type/functype/FuncType.kt | 11 ++++------- 8 files changed, 33 insertions(+), 47 deletions(-) diff --git a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/bounded/AbstractMonolithicExpr.kt b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/bounded/AbstractMonolithicExpr.kt index d39e20b8ab..c5fc50946b 100644 --- a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/bounded/AbstractMonolithicExpr.kt +++ b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/bounded/AbstractMonolithicExpr.kt @@ -27,10 +27,11 @@ import hu.bme.mit.theta.core.type.booltype.BoolExprs import hu.bme.mit.theta.core.type.booltype.BoolLitExpr import hu.bme.mit.theta.core.type.booltype.BoolType import hu.bme.mit.theta.core.type.booltype.IffExpr -import hu.bme.mit.theta.core.type.booltype.SmartBoolExprs.* +import hu.bme.mit.theta.core.type.booltype.SmartBoolExprs.And +import hu.bme.mit.theta.core.type.booltype.SmartBoolExprs.Not +import hu.bme.mit.theta.core.type.booltype.SmartBoolExprs.Or import hu.bme.mit.theta.core.utils.ExprUtils import hu.bme.mit.theta.core.utils.indexings.VarIndexingFactory -import java.util.HashMap fun MonolithicExpr.createAbstract(prec: PredPrec): MonolithicExpr { // TODO: handle initOffsetIndex in abstract initExpr diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/BasicConstDecl.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/BasicConstDecl.kt index 9f0c5642f3..98d583e6b2 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/BasicConstDecl.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/BasicConstDecl.kt @@ -17,10 +17,7 @@ package hu.bme.mit.theta.core.decl import hu.bme.mit.theta.core.type.Type import hu.bme.mit.theta.core.utils.UniqueIdProvider -import kotlinx.serialization.KSerializer -import kotlinx.serialization.PolymorphicSerializer -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable +import kotlinx.serialization.* import kotlinx.serialization.descriptors.SerialDescriptor import kotlinx.serialization.descriptors.buildClassSerialDescriptor import kotlinx.serialization.descriptors.element @@ -71,14 +68,14 @@ data class BasicConstDecl( 1 -> type = decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Type::class)) 2 -> id = decodeIntElement(descriptor, 2) CompositeDecoder.DECODE_DONE -> break - else -> error("Unexpected index: $index") + else -> throw SerializationException("Unexpected index: $index") } } BasicConstDecl( - name = name ?: error("Missing name"), - type = type ?: error("Missing type"), - id = id ?: error("Missing id"), + name = name ?: throw SerializationException("Missing name"), + type = type ?: throw SerializationException("Missing type"), + id = id ?: throw SerializationException("Missing id"), ) } } diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/IndexedConstDecl.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/IndexedConstDecl.kt index 59ec5ebe97..538ff28bc4 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/IndexedConstDecl.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/IndexedConstDecl.kt @@ -84,9 +84,9 @@ data class IndexedConstDecl( } IndexedConstDecl( - varDecl = varDecl ?: error("Missing varDecl"), - index = index ?: error("Missing index"), - id = id ?: error("Missing id"), + varDecl = varDecl ?: throw SerializationException("Missing varDecl"), + index = index ?: throw SerializationException("Missing index"), + id = id ?: throw SerializationException("Missing id"), ) } } diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/ParamDecl.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/ParamDecl.kt index 5ba767d47b..da1bb3d8ff 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/ParamDecl.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/ParamDecl.kt @@ -18,10 +18,7 @@ package hu.bme.mit.theta.core.decl import hu.bme.mit.theta.common.Utils import hu.bme.mit.theta.core.type.Type import hu.bme.mit.theta.core.utils.UniqueIdProvider -import kotlinx.serialization.KSerializer -import kotlinx.serialization.PolymorphicSerializer -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable +import kotlinx.serialization.* import kotlinx.serialization.descriptors.SerialDescriptor import kotlinx.serialization.descriptors.buildClassSerialDescriptor import kotlinx.serialization.descriptors.element @@ -73,14 +70,14 @@ data class ParamDecl( 1 -> type = decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Type::class)) 2 -> id = decodeIntElement(descriptor, 2) CompositeDecoder.DECODE_DONE -> break - else -> error("Unexpected index: $index") + else -> throw SerializationException("Unexpected index: $index") } } ParamDecl( - name = name ?: error("Missing name"), - type = type ?: error("Missing type"), - id = id ?: error("Missing id"), + name = name ?: throw SerializationException("Missing name"), + type = type ?: throw SerializationException("Missing type"), + id = id ?: throw SerializationException("Missing id"), ) } } diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/VarDecl.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/VarDecl.kt index 18edec5c4b..de6e50e82b 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/VarDecl.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/decl/VarDecl.kt @@ -86,14 +86,14 @@ data class VarDecl( 1 -> type = decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Type::class)) 2 -> id = decodeIntElement(descriptor, 2) CompositeDecoder.DECODE_DONE -> break - else -> error("Unexpected index: $index") + else -> throw SerializationException("Unexpected index: $index") } } VarDecl( - name = name ?: error("Missing name"), - type = type ?: error("Missing type"), - id = id ?: error("Missing id"), + name = name ?: throw SerializationException("Missing name"), + type = type ?: throw SerializationException("Missing type"), + id = id ?: throw SerializationException("Missing id"), ) } } diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayLitExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayLitExpr.kt index 4de6c986bf..935d7572f7 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayLitExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayLitExpr.kt @@ -23,10 +23,7 @@ import hu.bme.mit.theta.core.type.LitExpr import hu.bme.mit.theta.core.type.NullaryExpr import hu.bme.mit.theta.core.type.Type import hu.bme.mit.theta.core.utils.ExprSimplifier -import kotlinx.serialization.KSerializer -import kotlinx.serialization.PolymorphicSerializer -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable +import kotlinx.serialization.* import kotlinx.serialization.builtins.ListSerializer import kotlinx.serialization.builtins.PairSerializer import kotlinx.serialization.descriptors.SerialDescriptor @@ -131,14 +128,14 @@ data class ArrayLitExpr( decodeSerializableElement(descriptor, 2, PolymorphicSerializer(Type::class)) as ArrayType CompositeDecoder.DECODE_DONE -> break - else -> error("Unexpected index: $index") + else -> throw SerializationException("Unexpected index: $index") } } ArrayLitExpr( - elements = elements ?: error("Missing elements"), - elseElem = elseElem ?: error("Missing elseElem"), - type = type ?: error("Missing type"), + elements = elements ?: throw SerializationException("Missing elements"), + elseElem = elseElem ?: throw SerializationException("Missing elseElem"), + type = type ?: throw SerializationException("Missing type"), ) } } diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayType.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayType.kt index 835a974322..380503eb54 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayType.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/arraytype/ArrayType.kt @@ -22,10 +22,7 @@ import hu.bme.mit.theta.core.type.Type import hu.bme.mit.theta.core.type.abstracttype.EqExpr import hu.bme.mit.theta.core.type.abstracttype.Equational import hu.bme.mit.theta.core.type.abstracttype.NeqExpr -import kotlinx.serialization.KSerializer -import kotlinx.serialization.PolymorphicSerializer -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable +import kotlinx.serialization.* import kotlinx.serialization.descriptors.SerialDescriptor import kotlinx.serialization.descriptors.buildClassSerialDescriptor import kotlinx.serialization.descriptors.element @@ -98,13 +95,13 @@ data class ArrayType( elemType = decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Type::class)) CompositeDecoder.DECODE_DONE -> break - else -> error("Unexpected index: $index") + else -> throw SerializationException("Unexpected index: $index") } } ArrayType( - indexType = indexType ?: error("Missing indexType"), - elemType = elemType ?: error("Missing elemType"), + indexType = indexType ?: throw SerializationException("Missing indexType"), + elemType = elemType ?: throw SerializationException("Missing elemType"), ) } } diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/functype/FuncType.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/functype/FuncType.kt index 2fa82fab55..4373e2f25b 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/functype/FuncType.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/functype/FuncType.kt @@ -18,10 +18,7 @@ package hu.bme.mit.theta.core.type.functype import hu.bme.mit.theta.common.Utils import hu.bme.mit.theta.core.type.DomainSize import hu.bme.mit.theta.core.type.Type -import kotlinx.serialization.KSerializer -import kotlinx.serialization.PolymorphicSerializer -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable +import kotlinx.serialization.* import kotlinx.serialization.descriptors.SerialDescriptor import kotlinx.serialization.descriptors.buildClassSerialDescriptor import kotlinx.serialization.descriptors.element @@ -87,13 +84,13 @@ data class FuncType( resultType = decodeSerializableElement(descriptor, 1, PolymorphicSerializer(Type::class)) CompositeDecoder.DECODE_DONE -> break - else -> error("Unexpected index: $index") + else -> throw SerializationException("Unexpected index: $index") } } FuncType( - paramType = paramType ?: error("Missing paramType"), - resultType = resultType ?: error("Missing resultType"), + paramType = paramType ?: throw SerializationException("Missing paramType"), + resultType = resultType ?: throw SerializationException("Missing resultType"), ) } } From d961ffd729e6e5a388134d0fee71b695a9d0f41c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Csan=C3=A1d=20Telbisz?= Date: Tue, 2 Sep 2025 16:00:20 +0200 Subject: [PATCH 48/48] converting checks --- .../kotlin/hu/bme/mit/theta/core/type/bvtype/BvAddExpr.kt | 5 +++++ .../kotlin/hu/bme/mit/theta/core/type/bvtype/BvAndExpr.kt | 5 +++++ .../mit/theta/core/type/bvtype/BvArithShiftRightExpr.kt | 5 +++++ .../hu/bme/mit/theta/core/type/bvtype/BvConcatExpr.kt | 4 ++++ .../kotlin/hu/bme/mit/theta/core/type/bvtype/BvEqExpr.kt | 5 +++++ .../hu/bme/mit/theta/core/type/bvtype/BvExtractExpr.kt | 7 +++++++ .../mit/theta/core/type/bvtype/BvLogicShiftRightExpr.kt | 5 +++++ .../kotlin/hu/bme/mit/theta/core/type/bvtype/BvMulExpr.kt | 5 +++++ .../kotlin/hu/bme/mit/theta/core/type/bvtype/BvNeqExpr.kt | 5 +++++ .../kotlin/hu/bme/mit/theta/core/type/bvtype/BvOrExpr.kt | 5 +++++ .../hu/bme/mit/theta/core/type/bvtype/BvRotateLeftExpr.kt | 5 +++++ .../hu/bme/mit/theta/core/type/bvtype/BvRotateRightExpr.kt | 5 +++++ .../kotlin/hu/bme/mit/theta/core/type/bvtype/BvSDivExpr.kt | 6 ++++++ .../kotlin/hu/bme/mit/theta/core/type/bvtype/BvSExtExpr.kt | 4 ++++ .../kotlin/hu/bme/mit/theta/core/type/bvtype/BvSGeqExpr.kt | 5 +++++ .../kotlin/hu/bme/mit/theta/core/type/bvtype/BvSGtExpr.kt | 5 +++++ .../kotlin/hu/bme/mit/theta/core/type/bvtype/BvSLeqExpr.kt | 5 +++++ .../kotlin/hu/bme/mit/theta/core/type/bvtype/BvSLtExpr.kt | 5 +++++ .../kotlin/hu/bme/mit/theta/core/type/bvtype/BvSModExpr.kt | 6 ++++++ .../kotlin/hu/bme/mit/theta/core/type/bvtype/BvSRemExpr.kt | 6 ++++++ .../hu/bme/mit/theta/core/type/bvtype/BvShiftLeftExpr.kt | 5 +++++ .../kotlin/hu/bme/mit/theta/core/type/bvtype/BvSubExpr.kt | 5 +++++ .../kotlin/hu/bme/mit/theta/core/type/bvtype/BvUDivExpr.kt | 6 ++++++ .../kotlin/hu/bme/mit/theta/core/type/bvtype/BvUGeqExpr.kt | 5 +++++ .../kotlin/hu/bme/mit/theta/core/type/bvtype/BvUGtExpr.kt | 5 +++++ .../kotlin/hu/bme/mit/theta/core/type/bvtype/BvULeqExpr.kt | 5 +++++ .../kotlin/hu/bme/mit/theta/core/type/bvtype/BvULtExpr.kt | 5 +++++ .../kotlin/hu/bme/mit/theta/core/type/bvtype/BvURemExpr.kt | 6 ++++++ .../kotlin/hu/bme/mit/theta/core/type/bvtype/BvXorExpr.kt | 5 +++++ .../kotlin/hu/bme/mit/theta/core/type/bvtype/BvZExtExpr.kt | 4 ++++ .../kotlin/hu/bme/mit/theta/core/type/fptype/FpAbsExpr.kt | 1 + .../kotlin/hu/bme/mit/theta/core/type/fptype/FpDivExpr.kt | 1 + .../kotlin/hu/bme/mit/theta/core/type/fptype/FpEqExpr.kt | 1 + .../kotlin/hu/bme/mit/theta/core/type/fptype/FpGeqExpr.kt | 1 + .../kotlin/hu/bme/mit/theta/core/type/fptype/FpGtExpr.kt | 1 + .../hu/bme/mit/theta/core/type/fptype/FpIsInfiniteExpr.kt | 5 +++++ .../hu/bme/mit/theta/core/type/fptype/FpIsNanExpr.kt | 5 +++++ .../kotlin/hu/bme/mit/theta/core/type/fptype/FpLeqExpr.kt | 1 + .../kotlin/hu/bme/mit/theta/core/type/fptype/FpPosExpr.kt | 1 + .../mit/theta/core/type/fptype/FpRoundToIntegralExpr.kt | 1 + .../kotlin/hu/bme/mit/theta/core/type/fptype/FpToFpExpr.kt | 1 + 41 files changed, 173 insertions(+) diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvAddExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvAddExpr.kt index ca750b95f5..a2da8229f4 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvAddExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvAddExpr.kt @@ -19,6 +19,7 @@ import hu.bme.mit.theta.core.model.Valuation import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.abstracttype.AddExpr import hu.bme.mit.theta.core.utils.TypeUtils +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -26,6 +27,10 @@ import kotlinx.serialization.Serializable @SerialName("BvAdd") data class BvAddExpr(override val ops: List>) : AddExpr() { + init { + checkAllTypesEqual(ops) + } + companion object { private const val OPERATOR_LABEL = "bvadd" diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvAndExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvAndExpr.kt index e9970fd030..51c47d1b86 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvAndExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvAndExpr.kt @@ -19,6 +19,7 @@ import hu.bme.mit.theta.core.model.Valuation import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.MultiaryExpr import hu.bme.mit.theta.core.utils.TypeUtils +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -26,6 +27,10 @@ import kotlinx.serialization.Serializable @SerialName("BvAnd") data class BvAndExpr(override val ops: List>) : MultiaryExpr() { + init { + checkAllTypesEqual(ops) + } + companion object { private const val OPERATOR_LABEL = "bvand" diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvArithShiftRightExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvArithShiftRightExpr.kt index 9f951d5ea2..26a5a458db 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvArithShiftRightExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvArithShiftRightExpr.kt @@ -19,6 +19,7 @@ import hu.bme.mit.theta.core.model.Valuation import hu.bme.mit.theta.core.type.BinaryExpr import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.utils.TypeUtils +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -29,6 +30,10 @@ data class BvArithShiftRightExpr( override val rightOp: Expr, ) : BinaryExpr() { + init { + checkAllTypesEqual(leftOp, rightOp) + } + companion object { private const val OPERATOR_LABEL = "bvashr" diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvConcatExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvConcatExpr.kt index bb56ded125..6989767503 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvConcatExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvConcatExpr.kt @@ -26,6 +26,10 @@ import kotlinx.serialization.Serializable @SerialName("BvConcat") data class BvConcatExpr(override val ops: List>) : Expr { + init { + check(ops.isNotEmpty()) + } + companion object { private const val OPERATOR_LABEL = "++" diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvEqExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvEqExpr.kt index bab7497146..b729d91947 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvEqExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvEqExpr.kt @@ -22,6 +22,7 @@ import hu.bme.mit.theta.core.type.booltype.BoolExprs import hu.bme.mit.theta.core.type.booltype.BoolLitExpr import hu.bme.mit.theta.core.type.booltype.BoolType import hu.bme.mit.theta.core.utils.TypeUtils +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -30,6 +31,10 @@ import kotlinx.serialization.Serializable data class BvEqExpr(override val leftOp: Expr, override val rightOp: Expr) : EqExpr() { + init { + checkAllTypesEqual(leftOp, rightOp) + } + companion object { private const val OPERATOR_LABEL = "=" diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvExtractExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvExtractExpr.kt index 037f79cce0..493ebcf32a 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvExtractExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvExtractExpr.kt @@ -22,6 +22,7 @@ import hu.bme.mit.theta.core.type.inttype.IntExprs.Int import hu.bme.mit.theta.core.type.inttype.IntLitExpr import hu.bme.mit.theta.core.utils.TypeUtils import hu.bme.mit.theta.core.utils.TypeUtils.castBv +import java.math.BigInteger import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -30,6 +31,12 @@ import kotlinx.serialization.Serializable data class BvExtractExpr(val bitvec: Expr, val from: IntLitExpr, val until: IntLitExpr) : Expr { + init { + check(from.value >= BigInteger.ZERO) + check(until.value >= BigInteger.ZERO) + check(until.value > from.value) + } + companion object { private const val OPERATOR_LABEL = "extract" diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvLogicShiftRightExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvLogicShiftRightExpr.kt index 99eda3a1d2..218d263092 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvLogicShiftRightExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvLogicShiftRightExpr.kt @@ -19,6 +19,7 @@ import hu.bme.mit.theta.core.model.Valuation import hu.bme.mit.theta.core.type.BinaryExpr import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.utils.TypeUtils +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -29,6 +30,10 @@ data class BvLogicShiftRightExpr( override val rightOp: Expr, ) : BinaryExpr() { + init { + checkAllTypesEqual(leftOp, rightOp) + } + companion object { private const val OPERATOR_LABEL = "bvlshr" diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvMulExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvMulExpr.kt index 7305d8e74e..f5f6d7f102 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvMulExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvMulExpr.kt @@ -19,6 +19,7 @@ import hu.bme.mit.theta.core.model.Valuation import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.abstracttype.MulExpr import hu.bme.mit.theta.core.utils.TypeUtils +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -26,6 +27,10 @@ import kotlinx.serialization.Serializable @SerialName("BvMul") data class BvMulExpr(override val ops: List>) : MulExpr() { + init { + checkAllTypesEqual(ops) + } + companion object { private const val OPERATOR_LABEL = "bvmul" diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvNeqExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvNeqExpr.kt index 81ee2fe9ca..726839dd01 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvNeqExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvNeqExpr.kt @@ -22,6 +22,7 @@ import hu.bme.mit.theta.core.type.booltype.BoolExprs import hu.bme.mit.theta.core.type.booltype.BoolLitExpr import hu.bme.mit.theta.core.type.booltype.BoolType import hu.bme.mit.theta.core.utils.TypeUtils +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -30,6 +31,10 @@ import kotlinx.serialization.Serializable data class BvNeqExpr(override val leftOp: Expr, override val rightOp: Expr) : NeqExpr() { + init { + checkAllTypesEqual(leftOp, rightOp) + } + companion object { private const val OPERATOR_LABEL = "/=" diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvOrExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvOrExpr.kt index 37b16882e0..9cf7ab8ab6 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvOrExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvOrExpr.kt @@ -19,6 +19,7 @@ import hu.bme.mit.theta.core.model.Valuation import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.MultiaryExpr import hu.bme.mit.theta.core.utils.TypeUtils +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -26,6 +27,10 @@ import kotlinx.serialization.Serializable @SerialName("BvOr") data class BvOrExpr(override val ops: List>) : MultiaryExpr() { + init { + checkAllTypesEqual(ops) + } + companion object { private const val OPERATOR_LABEL = "bvor" diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvRotateLeftExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvRotateLeftExpr.kt index 15e1e36e16..e4cdac74ac 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvRotateLeftExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvRotateLeftExpr.kt @@ -19,6 +19,7 @@ import hu.bme.mit.theta.core.model.Valuation import hu.bme.mit.theta.core.type.BinaryExpr import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.utils.TypeUtils +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -27,6 +28,10 @@ import kotlinx.serialization.Serializable data class BvRotateLeftExpr(override val leftOp: Expr, override val rightOp: Expr) : BinaryExpr() { + init { + checkAllTypesEqual(leftOp, rightOp) + } + companion object { private const val OPERATOR_LABEL = "bvrol" diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvRotateRightExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvRotateRightExpr.kt index cc572e40c0..25d5e7540b 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvRotateRightExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvRotateRightExpr.kt @@ -19,6 +19,7 @@ import hu.bme.mit.theta.core.model.Valuation import hu.bme.mit.theta.core.type.BinaryExpr import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.utils.TypeUtils +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -29,6 +30,10 @@ data class BvRotateRightExpr( override val rightOp: Expr, ) : BinaryExpr() { + init { + checkAllTypesEqual(leftOp, rightOp) + } + companion object { private const val OPERATOR_LABEL = "bvror" diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSDivExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSDivExpr.kt index 285a155834..1a1399b3c2 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSDivExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSDivExpr.kt @@ -19,6 +19,7 @@ import hu.bme.mit.theta.core.model.Valuation import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.abstracttype.DivExpr import hu.bme.mit.theta.core.utils.TypeUtils +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -26,6 +27,11 @@ import kotlinx.serialization.Serializable @SerialName("BvSDiv") data class BvSDivExpr(override val leftOp: Expr, override val rightOp: Expr) : DivExpr() { + + init { + checkAllTypesEqual(leftOp, rightOp) + } + companion object { private const val OPERATOR_LABEL = "bvsdiv" diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSExtExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSExtExpr.kt index 5e385da468..c678f6adfa 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSExtExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSExtExpr.kt @@ -27,6 +27,10 @@ import kotlinx.serialization.Serializable @SerialName("BvSExt") data class BvSExtExpr(val op: Expr, val extendType: BvType) : Expr { + init { + check(extendType.size >= op.type.size) + } + companion object { private const val OPERATOR_LABEL = "bv_sign_extend" diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSGeqExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSGeqExpr.kt index 028ff556a5..64736f6609 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSGeqExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSGeqExpr.kt @@ -21,6 +21,7 @@ import hu.bme.mit.theta.core.type.LitExpr import hu.bme.mit.theta.core.type.abstracttype.GeqExpr import hu.bme.mit.theta.core.type.booltype.BoolType import hu.bme.mit.theta.core.utils.TypeUtils +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -29,6 +30,10 @@ import kotlinx.serialization.Serializable data class BvSGeqExpr(override val leftOp: Expr, override val rightOp: Expr) : GeqExpr() { + init { + checkAllTypesEqual(leftOp, rightOp) + } + companion object { private const val OPERATOR_LABEL = "bvsge" diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSGtExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSGtExpr.kt index 9d7c8b3787..f9f4d6013f 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSGtExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSGtExpr.kt @@ -21,6 +21,7 @@ import hu.bme.mit.theta.core.type.LitExpr import hu.bme.mit.theta.core.type.abstracttype.GtExpr import hu.bme.mit.theta.core.type.booltype.BoolType import hu.bme.mit.theta.core.utils.TypeUtils +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -29,6 +30,10 @@ import kotlinx.serialization.Serializable data class BvSGtExpr(override val leftOp: Expr, override val rightOp: Expr) : GtExpr() { + init { + checkAllTypesEqual(leftOp, rightOp) + } + companion object { private const val OPERATOR_LABEL = "bvsgt" diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSLeqExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSLeqExpr.kt index dca7a7813c..6be2f6364a 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSLeqExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSLeqExpr.kt @@ -21,6 +21,7 @@ import hu.bme.mit.theta.core.type.LitExpr import hu.bme.mit.theta.core.type.abstracttype.LeqExpr import hu.bme.mit.theta.core.type.booltype.BoolType import hu.bme.mit.theta.core.utils.TypeUtils +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -29,6 +30,10 @@ import kotlinx.serialization.Serializable data class BvSLeqExpr(override val leftOp: Expr, override val rightOp: Expr) : LeqExpr() { + init { + checkAllTypesEqual(leftOp, rightOp) + } + companion object { private const val OPERATOR_LABEL = "bvsle" diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSLtExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSLtExpr.kt index 33417c11d0..79b4d6201e 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSLtExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSLtExpr.kt @@ -21,6 +21,7 @@ import hu.bme.mit.theta.core.type.LitExpr import hu.bme.mit.theta.core.type.abstracttype.LtExpr import hu.bme.mit.theta.core.type.booltype.BoolType import hu.bme.mit.theta.core.utils.TypeUtils +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -29,6 +30,10 @@ import kotlinx.serialization.Serializable data class BvSLtExpr(override val leftOp: Expr, override val rightOp: Expr) : LtExpr() { + init { + checkAllTypesEqual(leftOp, rightOp) + } + companion object { private const val OPERATOR_LABEL = "bvslt" diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSModExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSModExpr.kt index 6875d3b3b3..cec0b0bdf2 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSModExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSModExpr.kt @@ -19,6 +19,7 @@ import hu.bme.mit.theta.core.model.Valuation import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.abstracttype.ModExpr import hu.bme.mit.theta.core.utils.TypeUtils +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -26,6 +27,11 @@ import kotlinx.serialization.Serializable @SerialName("BvSMod") data class BvSModExpr(override val leftOp: Expr, override val rightOp: Expr) : ModExpr() { + + init { + checkAllTypesEqual(leftOp, rightOp) + } + companion object { private const val OPERATOR_LABEL = "bvsmod" diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSRemExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSRemExpr.kt index bc6e0dc6c9..9589c50014 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSRemExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSRemExpr.kt @@ -19,6 +19,7 @@ import hu.bme.mit.theta.core.model.Valuation import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.abstracttype.RemExpr import hu.bme.mit.theta.core.utils.TypeUtils +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -26,6 +27,11 @@ import kotlinx.serialization.Serializable @SerialName("BvSRem") data class BvSRemExpr(override val leftOp: Expr, override val rightOp: Expr) : RemExpr() { + + init { + checkAllTypesEqual(leftOp, rightOp) + } + companion object { private const val OPERATOR_LABEL = "bvsrem" diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvShiftLeftExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvShiftLeftExpr.kt index c577affe85..4ab958671e 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvShiftLeftExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvShiftLeftExpr.kt @@ -19,6 +19,7 @@ import hu.bme.mit.theta.core.model.Valuation import hu.bme.mit.theta.core.type.BinaryExpr import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.utils.TypeUtils +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -27,6 +28,10 @@ import kotlinx.serialization.Serializable data class BvShiftLeftExpr(override val leftOp: Expr, override val rightOp: Expr) : BinaryExpr() { + init { + checkAllTypesEqual(leftOp, rightOp) + } + companion object { private const val OPERATOR_LABEL = "bvshl" diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSubExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSubExpr.kt index 229f9a1609..ed9694ae28 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSubExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvSubExpr.kt @@ -19,6 +19,7 @@ import hu.bme.mit.theta.core.model.Valuation import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.abstracttype.SubExpr import hu.bme.mit.theta.core.utils.TypeUtils +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -27,6 +28,10 @@ import kotlinx.serialization.Serializable data class BvSubExpr(override val leftOp: Expr, override val rightOp: Expr) : SubExpr() { + init { + checkAllTypesEqual(leftOp, rightOp) + } + companion object { private const val OPERATOR_LABEL = "bvsub" diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvUDivExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvUDivExpr.kt index e728d54900..d193ea780e 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvUDivExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvUDivExpr.kt @@ -19,6 +19,7 @@ import hu.bme.mit.theta.core.model.Valuation import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.abstracttype.DivExpr import hu.bme.mit.theta.core.utils.TypeUtils +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -26,6 +27,11 @@ import kotlinx.serialization.Serializable @SerialName("BvUDiv") data class BvUDivExpr(override val leftOp: Expr, override val rightOp: Expr) : DivExpr() { + + init { + checkAllTypesEqual(leftOp, rightOp) + } + companion object { private const val OPERATOR_LABEL = "bvudiv" diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvUGeqExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvUGeqExpr.kt index b670f06a9e..c94003df4d 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvUGeqExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvUGeqExpr.kt @@ -21,6 +21,7 @@ import hu.bme.mit.theta.core.type.LitExpr import hu.bme.mit.theta.core.type.abstracttype.GeqExpr import hu.bme.mit.theta.core.type.booltype.BoolType import hu.bme.mit.theta.core.utils.TypeUtils +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -29,6 +30,10 @@ import kotlinx.serialization.Serializable data class BvUGeqExpr(override val leftOp: Expr, override val rightOp: Expr) : GeqExpr() { + init { + checkAllTypesEqual(leftOp, rightOp) + } + companion object { private const val OPERATOR_LABEL = "bvuge" diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvUGtExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvUGtExpr.kt index 17a785743b..3cdb8dc53d 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvUGtExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvUGtExpr.kt @@ -21,6 +21,7 @@ import hu.bme.mit.theta.core.type.LitExpr import hu.bme.mit.theta.core.type.abstracttype.GtExpr import hu.bme.mit.theta.core.type.booltype.BoolType import hu.bme.mit.theta.core.utils.TypeUtils +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -29,6 +30,10 @@ import kotlinx.serialization.Serializable data class BvUGtExpr(override val leftOp: Expr, override val rightOp: Expr) : GtExpr() { + init { + checkAllTypesEqual(leftOp, rightOp) + } + companion object { private const val OPERATOR_LABEL = "bvugt" diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvULeqExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvULeqExpr.kt index 09479742ae..f08d0d7a44 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvULeqExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvULeqExpr.kt @@ -21,6 +21,7 @@ import hu.bme.mit.theta.core.type.LitExpr import hu.bme.mit.theta.core.type.abstracttype.LeqExpr import hu.bme.mit.theta.core.type.booltype.BoolType import hu.bme.mit.theta.core.utils.TypeUtils +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -29,6 +30,10 @@ import kotlinx.serialization.Serializable data class BvULeqExpr(override val leftOp: Expr, override val rightOp: Expr) : LeqExpr() { + init { + checkAllTypesEqual(leftOp, rightOp) + } + companion object { private const val OPERATOR_LABEL = "bvule" diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvULtExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvULtExpr.kt index 48fe70b169..51f58e19d3 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvULtExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvULtExpr.kt @@ -21,6 +21,7 @@ import hu.bme.mit.theta.core.type.LitExpr import hu.bme.mit.theta.core.type.abstracttype.LtExpr import hu.bme.mit.theta.core.type.booltype.BoolType import hu.bme.mit.theta.core.utils.TypeUtils +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -29,6 +30,10 @@ import kotlinx.serialization.Serializable data class BvULtExpr(override val leftOp: Expr, override val rightOp: Expr) : LtExpr() { + init { + checkAllTypesEqual(leftOp, rightOp) + } + companion object { private const val OPERATOR_LABEL = "bvult" diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvURemExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvURemExpr.kt index b3d42440a7..0a5c59f773 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvURemExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvURemExpr.kt @@ -19,6 +19,7 @@ import hu.bme.mit.theta.core.model.Valuation import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.abstracttype.RemExpr import hu.bme.mit.theta.core.utils.TypeUtils +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -26,6 +27,11 @@ import kotlinx.serialization.Serializable @SerialName("BvURem") data class BvURemExpr(override val leftOp: Expr, override val rightOp: Expr) : RemExpr() { + + init { + checkAllTypesEqual(leftOp, rightOp) + } + companion object { private const val OPERATOR_LABEL = "bvurem" diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvXorExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvXorExpr.kt index 81ea44551e..39363a6dcc 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvXorExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvXorExpr.kt @@ -19,6 +19,7 @@ import hu.bme.mit.theta.core.model.Valuation import hu.bme.mit.theta.core.type.Expr import hu.bme.mit.theta.core.type.MultiaryExpr import hu.bme.mit.theta.core.utils.TypeUtils +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -26,6 +27,10 @@ import kotlinx.serialization.Serializable @SerialName("BvXor") data class BvXorExpr(override val ops: List>) : MultiaryExpr() { + init { + checkAllTypesEqual(ops) + } + companion object { private const val OPERATOR_LABEL = "bvxor" diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvZExtExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvZExtExpr.kt index 240665f81f..bcdd09783c 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvZExtExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/bvtype/BvZExtExpr.kt @@ -27,6 +27,10 @@ import kotlinx.serialization.Serializable @SerialName("BvZExt") data class BvZExtExpr(val op: Expr, val extendType: BvType) : Expr { + init { + check(extendType.size >= op.type.size) + } + companion object { private const val OPERATOR_LABEL = "bv_zero_extend" diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpAbsExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpAbsExpr.kt index fa911fb7da..1e2831ef52 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpAbsExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpAbsExpr.kt @@ -25,6 +25,7 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("FpAbs") data class FpAbsExpr(override val op: Expr) : UnaryExpr() { + companion object { private const val OPERATOR_LABEL = "fpabs" diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpDivExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpDivExpr.kt index f2ff4e2efe..42f3a9913a 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpDivExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpDivExpr.kt @@ -30,6 +30,7 @@ data class FpDivExpr( override val leftOp: Expr, override val rightOp: Expr, ) : DivExpr() { + init { checkAllTypesEqual(leftOp, rightOp) } diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpEqExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpEqExpr.kt index 8808f74c32..fc3c34d24c 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpEqExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpEqExpr.kt @@ -28,6 +28,7 @@ import kotlinx.serialization.Serializable @SerialName("FpEq") data class FpEqExpr(override val leftOp: Expr, override val rightOp: Expr) : EqExpr() { + init { checkAllTypesEqual(leftOp, rightOp) } diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpGeqExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpGeqExpr.kt index 969a796e8e..005f5a1d51 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpGeqExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpGeqExpr.kt @@ -28,6 +28,7 @@ import kotlinx.serialization.Serializable @SerialName("FpGeq") data class FpGeqExpr(override val leftOp: Expr, override val rightOp: Expr) : GeqExpr() { + init { checkAllTypesEqual(leftOp, rightOp) } diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpGtExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpGtExpr.kt index fe770b7186..179f9c4e79 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpGtExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpGtExpr.kt @@ -28,6 +28,7 @@ import kotlinx.serialization.Serializable @SerialName("FpGt") data class FpGtExpr(override val leftOp: Expr, override val rightOp: Expr) : GtExpr() { + init { checkAllTypesEqual(leftOp, rightOp) } diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpIsInfiniteExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpIsInfiniteExpr.kt index 5153bb7d41..9e7f2d4d37 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpIsInfiniteExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpIsInfiniteExpr.kt @@ -23,6 +23,7 @@ import hu.bme.mit.theta.core.type.booltype.BoolExprs.Or import hu.bme.mit.theta.core.type.booltype.BoolLitExpr import hu.bme.mit.theta.core.type.booltype.BoolType import hu.bme.mit.theta.core.utils.TypeUtils.castFp +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -30,6 +31,10 @@ import kotlinx.serialization.Serializable @SerialName("FpIsInfinite") data class FpIsInfiniteExpr(override val op: Expr) : UnaryExpr() { + init { + checkAllTypesEqual(op) + } + companion object { private const val OPERATOR_LABEL = "isinfinite" diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpIsNanExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpIsNanExpr.kt index 7cdacf007a..b96dc841c5 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpIsNanExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpIsNanExpr.kt @@ -22,6 +22,7 @@ import hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool import hu.bme.mit.theta.core.type.booltype.BoolLitExpr import hu.bme.mit.theta.core.type.booltype.BoolType import hu.bme.mit.theta.core.utils.TypeUtils.castFp +import hu.bme.mit.theta.core.utils.TypeUtils.checkAllTypesEqual import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable @@ -29,6 +30,10 @@ import kotlinx.serialization.Serializable @SerialName("FpIsNan") data class FpIsNanExpr(override val op: Expr) : UnaryExpr() { + init { + checkAllTypesEqual(op) + } + companion object { private const val OPERATOR_LABEL = "fpisnan" diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpLeqExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpLeqExpr.kt index 2ae88fb080..a71aa005a0 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpLeqExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpLeqExpr.kt @@ -28,6 +28,7 @@ import kotlinx.serialization.Serializable @SerialName("FpLeq") data class FpLeqExpr(override val leftOp: Expr, override val rightOp: Expr) : LeqExpr() { + init { checkAllTypesEqual(leftOp, rightOp) } diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpPosExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpPosExpr.kt index 772c1dad31..8d16749af3 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpPosExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpPosExpr.kt @@ -25,6 +25,7 @@ import kotlinx.serialization.Serializable @Serializable @SerialName("FpPos") data class FpPosExpr(override val op: Expr) : PosExpr() { + companion object { private const val OPERATOR_LABEL = "fppos" diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpRoundToIntegralExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpRoundToIntegralExpr.kt index 44caef5702..3fb7673637 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpRoundToIntegralExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpRoundToIntegralExpr.kt @@ -28,6 +28,7 @@ import org.kframework.mpfr.BinaryMathContext @SerialName("FpRoundToIntegral") data class FpRoundToIntegralExpr(val roundingMode: FpRoundingMode, override val op: Expr) : UnaryExpr() { + companion object { private const val OPERATOR_LABEL = "fproundtoint" diff --git a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpToFpExpr.kt b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpToFpExpr.kt index 0871bfa58f..4e3fa15e94 100644 --- a/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpToFpExpr.kt +++ b/subprojects/common/core/src/main/kotlin/hu/bme/mit/theta/core/type/fptype/FpToFpExpr.kt @@ -32,6 +32,7 @@ data class FpToFpExpr( val expBits: Int, val signBits: Int, ) : UnaryExpr() { + companion object { private const val OPERATOR_LABEL = "fptofp"