From e9c280922613b1109e5d8c3b651be5626c235795 Mon Sep 17 00:00:00 2001 From: Mattia Matteini Date: Sat, 23 Sep 2023 19:52:37 +0200 Subject: [PATCH 1/7] docs: add package svg --- doc/diagrams/mvu/mvu-detailed.drawio | 43 ---------------------- doc/diagrams/mvu/mvu-detailed.png | Bin 117320 -> 0 bytes doc/diagrams/mvu/mvu-detailed.puml | 22 ------------ doc/diagrams/mvu/mvu.drawio | 51 --------------------------- doc/report/2-requirements.md | 29 ++++++++------- doc/report/4-detailed-design.md | 3 ++ doc/report/img/packages.svg | 4 +++ 7 files changed, 23 insertions(+), 129 deletions(-) delete mode 100644 doc/diagrams/mvu/mvu-detailed.drawio delete mode 100644 doc/diagrams/mvu/mvu-detailed.png delete mode 100644 doc/diagrams/mvu/mvu-detailed.puml delete mode 100644 doc/diagrams/mvu/mvu.drawio create mode 100644 doc/report/img/packages.svg diff --git a/doc/diagrams/mvu/mvu-detailed.drawio b/doc/diagrams/mvu/mvu-detailed.drawio deleted file mode 100644 index 448c29c2..00000000 --- a/doc/diagrams/mvu/mvu-detailed.drawio +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/doc/diagrams/mvu/mvu-detailed.png b/doc/diagrams/mvu/mvu-detailed.png deleted file mode 100644 index e86280144dbd4d3c436b326852da085ff49dc03a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 117320 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

C}DA?{X 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 z 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%0D`(<*(d5ss5aOZxxd%`C*{!8*%w!o;e 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 Dmn+7& diff --git a/doc/diagrams/mvu/mvu-detailed.puml b/doc/diagrams/mvu/mvu-detailed.puml deleted file mode 100644 index a4a90292..00000000 --- a/doc/diagrams/mvu/mvu-detailed.puml +++ /dev/null @@ -1,22 +0,0 @@ -@startuml -entity ModelComponent << trait >> { - type Model - var model: Model -} -entity ViewComponent << trait >> { - type View - val view: View -} -entity UpdateComponent << trait >> { - type Update - val update: Update -} -entity MVU << trait >> -note left: Mixed-in with the components - - -ModelComponent <|-- MVU -ViewComponent <|-- MVU -UpdateComponent <|-- MVU - -@enduml diff --git a/doc/diagrams/mvu/mvu.drawio b/doc/diagrams/mvu/mvu.drawio deleted file mode 100644 index 1146215c..00000000 --- a/doc/diagrams/mvu/mvu.drawio +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/doc/report/2-requirements.md b/doc/report/2-requirements.md index 5635a1cb..b6d79e3e 100644 --- a/doc/report/2-requirements.md +++ b/doc/report/2-requirements.md @@ -126,8 +126,10 @@ to easily compose the instance (which is an **Expression**). 2. The system has to be user-friendly, providing few and intuitive buttons, help section and flexible input. 3. The system has to be easily extensible with other algorithms for conversion and solving. 4. The system has to be secure, avoiding any kind of code injection through the input. - 5. // TODO: performance requirements and tests - 6. // TODO: maybe + 5. The system performs efficiently, completing satisfiability checks for various problem instances within acceptable + time limits and depending on the instance dimension. + 6. // TODO: look at req number 5, i think it's ok if linked to scalameter tests (time and memory) + 7. // TODO: maybe 4. ## Implementation requirements 1. The system must be implemented in Scala 3.x.x, using SBT as automation build tool and JDK 17. @@ -141,16 +143,17 @@ to easily compose the instance (which is an **Expression**). ## Requirements traceability -| Requirement | Feature / Scenarios | -|:-----------------------------:|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:| -| [1.i](#user-requirements) | [DSL.feature](../../src/test/resources/features/DSL.feature) | -| [1.iii](#user-requirements) | [DSL.feature](../../src/test/resources/features/DSL.feature) | -| [1.iv](#user-requirements) | [SatEncodings.feature](../../src/test/resources/features/SatEncodings.feature) | -| [1.viii](#user-requirements) | [TseitinTransformation.feature](../../src/test/resources/features/TseitinTransformation.feature) | -| [2.i](#system-requirements) | [ProcessInputTest.scala](../../src/test/scala/satify/dsl/ProcessInputTest.scala) | -| [2.ii](#system-requirements) | [OperatorsTest.scala](../../src/test/scala/satify/dsl/OperatorsTest.scala)
[MathOperatorsTest.scala](../../src/test/scala/satify/dsl/MathOperatorsTest.scala)
[SatEncodingTest.scala](../../src/test/scala/satify/dsl/SatEncodingTest.scala) | -| [2.iii](#system-requirements) | [TseitinTest.scala](../../src/test/scala/satify/update/converters/tseitin/TseitinTest.scala) | -| add yours | add yours | -| [2.x](#system-requirements) | [problems package](../../src/test/scala/satify/problems) | +| Requirement | Feature / Scenarios | +|:-----------------------------------:|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:| +| [1.i](#user-requirements) | [DSL.feature](../../src/test/resources/features/DSL.feature) | +| [1.iii](#user-requirements) | [DSL.feature](../../src/test/resources/features/DSL.feature) | +| [1.iv](#user-requirements) | [SatEncodings.feature](../../src/test/resources/features/SatEncodings.feature) | +| [1.viii](#user-requirements) | [TseitinTransformation.feature](../../src/test/resources/features/TseitinTransformation.feature) | +| [2.i](#system-requirements) | [ProcessInputTest.scala](../../src/test/scala/satify/dsl/ProcessInputTest.scala) | +| [2.ii](#system-requirements) | [OperatorsTest.scala](../../src/test/scala/satify/dsl/OperatorsTest.scala)
[MathOperatorsTest.scala](../../src/test/scala/satify/dsl/MathOperatorsTest.scala)
[SatEncodingTest.scala](../../src/test/scala/satify/dsl/SatEncodingTest.scala) | +| [2.iii](#system-requirements) | [TseitinTest.scala](../../src/test/scala/satify/update/converters/tseitin/TseitinTest.scala) | +| add yours | add yours | +| [2.x](#system-requirements) | [problems package](../../src/test/scala/satify/problems) | +| [3.v](#non-functional-requirements) | [Tseitin Benchmarks](../../src/test/scala/satify/update/converters/tseitin/benchmark)
[DPLL Benchmarks](../../src/test/scala/satify/update/solver/dpll/benchmark) | [Previous](1-methodology.md) | [Next](3-architectural-design.md) diff --git a/doc/report/4-detailed-design.md b/doc/report/4-detailed-design.md index ec2b2ae3..862c10f3 100644 --- a/doc/report/4-detailed-design.md +++ b/doc/report/4-detailed-design.md @@ -3,6 +3,9 @@ --- ## Code organization +

+  Model-View-Update detailed diagram +

## Architecture diff --git a/doc/report/img/packages.svg b/doc/report/img/packages.svg new file mode 100644 index 00000000..2c2d2c86 --- /dev/null +++ b/doc/report/img/packages.svg @@ -0,0 +1,4 @@ + + + +
satify
satify
dsl
dsl
model
model
view
view
update
update
cnf
cnf
expression
expression
problems
problems
converters
converters
solver
solver
app
app
errors
errors
tseitin
tseitin
dpll
dpll
parser
parser
solver
solver
utils
utils
components
components
Text is not SVG - cannot display
\ No newline at end of file From 8e9c0c967b97397d538abf31c49476ed6b8549d5 Mon Sep 17 00:00:00 2001 From: Mattia Matteini Date: Sun, 24 Sep 2023 16:02:49 +0200 Subject: [PATCH 2/7] refactor: modify imports in benchmarks --- .../benchmark/ConversionMemoryBenchmark.scala | 12 +++++++----- .../benchmark/ConversionProblemBenchmark.scala | 8 ++++---- .../dpll/benchmark/SolvingMemoryBenchmark.scala | 14 ++++++++------ .../dpll/benchmark/SolvingProblemBenchmark.scala | 9 +++++---- 4 files changed, 24 insertions(+), 19 deletions(-) diff --git a/src/test/scala/satify/update/converters/tseitin/benchmark/ConversionMemoryBenchmark.scala b/src/test/scala/satify/update/converters/tseitin/benchmark/ConversionMemoryBenchmark.scala index 433e01a0..b8ce89e7 100644 --- a/src/test/scala/satify/update/converters/tseitin/benchmark/ConversionMemoryBenchmark.scala +++ b/src/test/scala/satify/update/converters/tseitin/benchmark/ConversionMemoryBenchmark.scala @@ -1,18 +1,20 @@ package satify.update.converters.tseitin.benchmark import org.scalameter.api.* -import satify.model.problems.{NQueens, GraphColoring, NurseScheduling} +import satify.model.problems.{GraphColoring, NQueens, NurseScheduling} import satify.update.converters.Converter -import satify.update.converters.ConverterType.Tseitin object ConversionMemoryBenchmark extends Bench.OfflineReport: + + import satify.update.converters.ConverterType.Tseitin + override def measurer = new Measurer.MemoryFootprint performance of "N-Queens conversion memory" in { val sizes: Gen[Int] = Gen.range("size")(2, 10, 1) measure method "N-Queens Conversion" in { using(sizes) in { size => - val cnf = Converter(Tseitin).convert(NQueens(size).exp, false) + Converter(Tseitin).convert(NQueens(size).exp, false) } } } @@ -24,7 +26,7 @@ object ConversionMemoryBenchmark extends Bench.OfflineReport: val sizes: Gen[Int] = Gen.range("size")(0, 1, 1) measure method "Graph-Coloring Conversion" in { using(sizes) in { size => - val cnf = Converter(Tseitin).convert(GraphColoring(edges, nodes, colors).exp, false) + Converter(Tseitin).convert(GraphColoring(edges, nodes, colors).exp, false) } } } @@ -36,7 +38,7 @@ object ConversionMemoryBenchmark extends Bench.OfflineReport: val sizes: Gen[Int] = Gen.range("size")(0, 1, 1) measure method "Nurse-Scheduling Conversion" in { using(sizes) in { size => - val cnf = Converter(Tseitin).convert(NurseScheduling(nurses, days, shifts).exp, false) + Converter(Tseitin).convert(NurseScheduling(nurses, days, shifts).exp, false) } } } diff --git a/src/test/scala/satify/update/converters/tseitin/benchmark/ConversionProblemBenchmark.scala b/src/test/scala/satify/update/converters/tseitin/benchmark/ConversionProblemBenchmark.scala index bc0f0f30..9b6dfced 100644 --- a/src/test/scala/satify/update/converters/tseitin/benchmark/ConversionProblemBenchmark.scala +++ b/src/test/scala/satify/update/converters/tseitin/benchmark/ConversionProblemBenchmark.scala @@ -3,16 +3,16 @@ package satify.update.converters.tseitin.benchmark import org.scalameter.api.* import satify.model.problems.{GraphColoring, NQueens, NurseScheduling} import satify.update.converters.Converter -import satify.update.converters.ConverterType.Tseitin object ConversionProblemBenchmark extends Bench.OfflineReport: + import satify.update.converters.ConverterType.Tseitin performance of "N-Queens conversion time" in { val sizes: Gen[Int] = Gen.range("size")(1, 10, 1) measure method "N-Queens Conversion" in { using(sizes) in { size => - val cnf = Converter(Tseitin).convert(NQueens(size).exp, false) + Converter(Tseitin).convert(NQueens(size).exp, false) } } } @@ -24,7 +24,7 @@ object ConversionProblemBenchmark extends Bench.OfflineReport: val sizes: Gen[Int] = Gen.range("size")(0, 1, 1) measure method "Graph-Coloring Conversion" in { using(sizes) in { size => - val cnf = Converter(Tseitin).convert(GraphColoring(edges, nodes, colors).exp, false) + Converter(Tseitin).convert(GraphColoring(edges, nodes, colors).exp, false) } } } @@ -36,7 +36,7 @@ object ConversionProblemBenchmark extends Bench.OfflineReport: val sizes: Gen[Int] = Gen.range("size")(0, 1, 1) measure method "Nurse-Scheduling Conversion" in { using(sizes) in { size => - val cnf = Converter(Tseitin).convert(NurseScheduling(nurses, days, shifts).exp, false) + Converter(Tseitin).convert(NurseScheduling(nurses, days, shifts).exp, false) } } } diff --git a/src/test/scala/satify/update/solver/dpll/benchmark/SolvingMemoryBenchmark.scala b/src/test/scala/satify/update/solver/dpll/benchmark/SolvingMemoryBenchmark.scala index 83f43a6c..997c1b66 100644 --- a/src/test/scala/satify/update/solver/dpll/benchmark/SolvingMemoryBenchmark.scala +++ b/src/test/scala/satify/update/solver/dpll/benchmark/SolvingMemoryBenchmark.scala @@ -1,19 +1,21 @@ package satify.update.solver.dpll.benchmark import org.scalameter.api.* -import satify.model.problems.{NQueens, NurseScheduling, GraphColoring} +import satify.model.problems.{GraphColoring, NQueens, NurseScheduling} import satify.update.solver.Solver -import satify.update.solver.SolverType.* -import satify.update.converters.ConverterType.Tseitin object SolvingMemoryBenchmark extends Bench.OfflineReport: + + import satify.update.converters.ConverterType.Tseitin + import satify.update.solver.SolverType.DPLL + override def measurer = new Measurer.MemoryFootprint performance of "N-Queens solving memory" in { val sizes: Gen[Int] = Gen.range("size")(2, 5, 1) measure method "N-Queens Solving" in { using(sizes) in { size => - val s = Solver(DPLL, Tseitin).solveAll(NQueens(size).exp, false) + Solver(DPLL, Tseitin).solveAll(NQueens(size).exp, false) } } } @@ -25,7 +27,7 @@ object SolvingMemoryBenchmark extends Bench.OfflineReport: val sizes: Gen[Int] = Gen.range("size")(0, 1, 1) measure method "Graph-Coloring Solving" in { using(sizes) in { size => - val s = Solver(DPLL, Tseitin).solveAll(GraphColoring(edges, nodes, colors).exp, false) + Solver(DPLL, Tseitin).solveAll(GraphColoring(edges, nodes, colors).exp, false) } } } @@ -37,7 +39,7 @@ object SolvingMemoryBenchmark extends Bench.OfflineReport: val sizes: Gen[Int] = Gen.range("size")(0, 1, 1) measure method "Nurse-Scheduling Solving" in { using(sizes) in { size => - val s = Solver(DPLL, Tseitin).solveAll(NurseScheduling(nurses, days, shifts).exp, false) + Solver(DPLL, Tseitin).solveAll(NurseScheduling(nurses, days, shifts).exp, false) } } } diff --git a/src/test/scala/satify/update/solver/dpll/benchmark/SolvingProblemBenchmark.scala b/src/test/scala/satify/update/solver/dpll/benchmark/SolvingProblemBenchmark.scala index 0aab76e8..8118777c 100644 --- a/src/test/scala/satify/update/solver/dpll/benchmark/SolvingProblemBenchmark.scala +++ b/src/test/scala/satify/update/solver/dpll/benchmark/SolvingProblemBenchmark.scala @@ -3,16 +3,17 @@ package satify.update.solver.dpll.benchmark import org.scalameter.api.* import satify.model.problems.{GraphColoring, NQueens, NurseScheduling} import satify.update.solver.Solver -import satify.update.solver.SolverType.* object SolvingProblemBenchmark extends Bench.LocalTime: + import satify.update.converters.ConverterType.Tseitin + import satify.update.solver.SolverType.DPLL performance of "N-Queens solving time" in { val sizes: Gen[Int] = Gen.range("size")(2, 5, 1) measure method "N-Queens Solving" in { using(sizes) in { size => - val s = Solver(DPLL, Tseitin).solveAll(NQueens(size).exp, false) + Solver(DPLL, Tseitin).solveAll(NQueens(size).exp, false) } } } @@ -24,7 +25,7 @@ object SolvingProblemBenchmark extends Bench.LocalTime: val sizes: Gen[Int] = Gen.range("size")(0, 1, 1) measure method "Graph-Coloring Solving" in { using(sizes) in { size => - val s = Solver(DPLL, Tseitin).solveAll(GraphColoring(edges, nodes, colors).exp, false) + Solver(DPLL, Tseitin).solveAll(GraphColoring(edges, nodes, colors).exp, false) } } } @@ -36,7 +37,7 @@ object SolvingProblemBenchmark extends Bench.LocalTime: val sizes: Gen[Int] = Gen.range("size")(0, 1, 1) measure method "Nurse-Scheduling Solving" in { using(sizes) in { size => - val s = Solver(DPLL, Tseitin).solveAll(NurseScheduling(nurses, days, shifts).exp, false) + Solver(DPLL, Tseitin).solveAll(NurseScheduling(nurses, days, shifts).exp, false) } } } From f47a93c2c4531b205d7ff311afc3ee68e2e96202 Mon Sep 17 00:00:00 2001 From: Mattia Matteini Date: Sun, 24 Sep 2023 16:04:53 +0200 Subject: [PATCH 3/7] refactor: modify name of print methods exp and cnf --- src/main/scala/satify/model/cnf/CNF.scala | 14 +++++++------- .../scala/satify/model/expression/Utils.scala | 14 +++++++------- src/main/scala/satify/update/Update.scala | 2 +- src/main/scala/satify/view/View.scala | 2 +- .../scala/satify/features/ConversionSteps.scala | 2 +- src/test/scala/satify/features/DSLSteps.scala | 2 +- .../scala/satify/model/cnf/CNFOutputTest.scala | 16 ++++++++-------- .../model/expression/ExpressionOutputTest.scala | 16 ++++++++-------- 8 files changed, 34 insertions(+), 34 deletions(-) diff --git a/src/main/scala/satify/model/cnf/CNF.scala b/src/main/scala/satify/model/cnf/CNF.scala index f41116c3..0bff0e1f 100644 --- a/src/main/scala/satify/model/cnf/CNF.scala +++ b/src/main/scala/satify/model/cnf/CNF.scala @@ -17,17 +17,17 @@ enum CNF: object CNF: extension (cnf: CNF) - def printAsDSL(flat: Boolean = false): String = + def asDSL(flat: Boolean = false): String = cnf match case Symbol(name) => name.toString case And(left, right) => - if flat then s"${left.printAsDSL(flat)} and ${right.printAsDSL(flat)}" - else s"${left.printAsDSL(flat)} and\n${right.printAsDSL(flat)}" - case Or(left, right) => s"${left.printAsDSL(flat)} or ${right.printAsDSL(flat)}" - case Not(branch) => s"not(${branch.printAsDSL(flat)})" + if flat then s"${left.asDSL(flat)} and ${right.asDSL(flat)}" + else s"${left.asDSL(flat)} and\n${right.asDSL(flat)}" + case Or(left, right) => s"${left.asDSL(flat)} or ${right.asDSL(flat)}" + case Not(branch) => s"not(${branch.asDSL(flat)})" - def printAsFormal(flat: Boolean = false): String = - var r = printAsDSL(flat) + def asFormal(flat: Boolean = false): String = + var r = asDSL(flat) .replace("and", "∧") .replace("or", "∨") .replace("not", "¬") diff --git a/src/main/scala/satify/model/expression/Utils.scala b/src/main/scala/satify/model/expression/Utils.scala index 87292b05..3f169aed 100644 --- a/src/main/scala/satify/model/expression/Utils.scala +++ b/src/main/scala/satify/model/expression/Utils.scala @@ -5,17 +5,17 @@ import satify.model.expression.Expression.{And, Not, Or, Symbol} object Utils: extension (exp: Expression) - def printAsDSL(flat: Boolean = false): String = + def asDSL(flat: Boolean = false): String = exp match case Symbol(value) => value case And(left, right) => - if flat then s"(${left.printAsDSL(flat)} and ${right.printAsDSL(flat)})" - else s"(${left.printAsDSL(flat)} and\n${right.printAsDSL(flat)})" - case Or(left, right) => s"(${left.printAsDSL(flat)} or ${right.printAsDSL(flat)})" - case Not(branch) => s"not(${branch.printAsDSL(flat)})" + if flat then s"(${left.asDSL(flat)} and ${right.asDSL(flat)})" + else s"(${left.asDSL(flat)} and\n${right.asDSL(flat)})" + case Or(left, right) => s"(${left.asDSL(flat)} or ${right.asDSL(flat)})" + case Not(branch) => s"not(${branch.asDSL(flat)})" - def printAsFormal(flat: Boolean = false): String = - var r = printAsDSL(flat) + def asFormal(flat: Boolean = false): String = + var r = asDSL(flat) .replace("and", "∧") .replace("or", "∨") .replace("not", "¬") diff --git a/src/main/scala/satify/update/Update.scala b/src/main/scala/satify/update/Update.scala index d729b406..fdb2191a 100644 --- a/src/main/scala/satify/update/Update.scala +++ b/src/main/scala/satify/update/Update.scala @@ -123,7 +123,7 @@ object Update: val lines = s.getLines.toSeq s.close() val cnf: CNF = parse(lines).getOrElse(Symbol("NO CNF")) - val input = cnf.printAsDSL() + val input = cnf.asDSL() State(input, cnf) safeUpdate(update) diff --git a/src/main/scala/satify/view/View.scala b/src/main/scala/satify/view/View.scala index 534f647b..12f16103 100644 --- a/src/main/scala/satify/view/View.scala +++ b/src/main/scala/satify/view/View.scala @@ -63,7 +63,7 @@ object View: } val fp: BoxPanel = new BoxPanel(Orientation.Vertical): name = cnfOutputDialogName - contents += new ScrollPane(createOutputTextArea(cnf.get.printAsFormal(), 30, 35)) + contents += new ScrollPane(createOutputTextArea(cnf.get.asFormal(), 30, 35)) contents += new FlowPanel(): contents += exportButton contents += new FlowPanel(): diff --git a/src/test/scala/satify/features/ConversionSteps.scala b/src/test/scala/satify/features/ConversionSteps.scala index bdad4f35..732bf801 100644 --- a/src/test/scala/satify/features/ConversionSteps.scala +++ b/src/test/scala/satify/features/ConversionSteps.scala @@ -20,5 +20,5 @@ object ConversionSteps extends ScalaDsl with EN: } Then("I should obtain the CNF {string}") { (expected: String) => - cnf.get.printAsDSL(true) shouldBe expected + cnf.get.asDSL(true) shouldBe expected } diff --git a/src/test/scala/satify/features/DSLSteps.scala b/src/test/scala/satify/features/DSLSteps.scala index 811ae9c4..d802ee75 100644 --- a/src/test/scala/satify/features/DSLSteps.scala +++ b/src/test/scala/satify/features/DSLSteps.scala @@ -20,7 +20,7 @@ object DSLSteps extends ScalaDsl with EN: } Then("I should obtain the expression {string}") { (expected: String) => - expression.get.printAsDSL(true) shouldBe expected + expression.get.asDSL(true) shouldBe expected } Then("I should obtain an IllegalArgumentException") { error shouldBe a[IllegalArgumentException] diff --git a/src/test/scala/satify/model/cnf/CNFOutputTest.scala b/src/test/scala/satify/model/cnf/CNFOutputTest.scala index 1fa7f765..a7ce221e 100644 --- a/src/test/scala/satify/model/cnf/CNFOutputTest.scala +++ b/src/test/scala/satify/model/cnf/CNFOutputTest.scala @@ -8,23 +8,23 @@ class CNFOutputTest extends AnyFlatSpec with Matchers: import satify.model.cnf.CNF.* "The cnf symbol a" should "be printed as a in formal way" in { - Symbol("a").printAsFormal(true) shouldBe "a" - Symbol("a").printAsFormal() shouldBe "a" + Symbol("a").asFormal(true) shouldBe "a" + Symbol("a").asFormal() shouldBe "a" } "The cnf exp ((a ∨ ¬b) ∧ c)" should "be printed in the formal way and according to the output flat mode" in { val cnfExp: CNF = And(Or(Symbol("a"), Not(Symbol("b"))), Symbol("c")) - cnfExp.printAsFormal(true) shouldBe "a ∨ ¬(b) ∧ c" - cnfExp.printAsFormal() shouldBe "a ∨ ¬(b) ∧\nc" + cnfExp.asFormal(true) shouldBe "a ∨ ¬(b) ∧ c" + cnfExp.asFormal() shouldBe "a ∨ ¬(b) ∧\nc" } "The only symbol a" should "be printed as a in DSL" in { - Symbol("a").printAsDSL(true) shouldBe "a" - Symbol("a").printAsDSL() shouldBe "a" + Symbol("a").asDSL(true) shouldBe "a" + Symbol("a").asDSL() shouldBe "a" } "The exp ((a ∨ ¬b) ∧ c)" should "be printed in the DSL format according to the output flat mode" in { val exp: CNF = And(Or(Symbol("a"), Not(Symbol("b"))), Symbol("c")) - exp.printAsDSL(true) shouldBe "a or not(b) and c" - exp.printAsDSL() shouldBe "a or not(b) and\nc" + exp.asDSL(true) shouldBe "a or not(b) and c" + exp.asDSL() shouldBe "a or not(b) and\nc" } diff --git a/src/test/scala/satify/model/expression/ExpressionOutputTest.scala b/src/test/scala/satify/model/expression/ExpressionOutputTest.scala index 9676802f..884637c7 100644 --- a/src/test/scala/satify/model/expression/ExpressionOutputTest.scala +++ b/src/test/scala/satify/model/expression/ExpressionOutputTest.scala @@ -9,8 +9,8 @@ class ExpressionOutputTest extends AnyFlatSpec with Matchers: "The only symbol a" should "be printed as a in formal way" in { val exp: Expression = Symbol("a") - val fRes: String = exp.printAsFormal(true) - val nfRes: String = exp.printAsFormal(false) + val fRes: String = exp.asFormal(true) + val nfRes: String = exp.asFormal(false) val expected = "a" List(fRes, nfRes) shouldBe List(expected, expected) } @@ -18,17 +18,17 @@ class ExpressionOutputTest extends AnyFlatSpec with Matchers: "The exp ((a ∧ ¬b) ∨ c)" should "be printed in the formal way according to the output flat mode" in { val exp: Expression = Or(And(Symbol("a"), Not(Symbol("b"))), Symbol("c")) - val fRes: String = exp.printAsFormal(true) + val fRes: String = exp.asFormal(true) val fExp = "((a ∧ ¬(b)) ∨ c)" - val nfRes: String = exp.printAsFormal(false) + val nfRes: String = exp.asFormal(false) val nfExp = "((a ∧\n¬(b)) ∨ c)" List(fRes, nfRes) shouldBe List(fExp, nfExp) } "The only symbol a" should "be printed as a in DSL" in { val exp: Expression = Symbol("a") - val fRes: String = exp.printAsDSL(true) - val nfRes: String = exp.printAsDSL(false) + val fRes: String = exp.asDSL(true) + val nfRes: String = exp.asDSL(false) val expected = "a" List(fRes, nfRes) shouldBe List(expected, expected) } @@ -36,9 +36,9 @@ class ExpressionOutputTest extends AnyFlatSpec with Matchers: "The exp ((a ∧ ¬b) ∨ c)" should "be printed in the DSL format according to the output flat mode" in { val exp: Expression = Or(And(Symbol("a"), Not(Symbol("b"))), Symbol("c")) - val fRes: String = exp.printAsDSL(true) + val fRes: String = exp.asDSL(true) val fExp = "((a and not(b)) or c)" - val nfRes: String = exp.printAsDSL(false) + val nfRes: String = exp.asDSL(false) val nfExp = "((a and\nnot(b)) or c)" List(fRes, nfRes) shouldBe List(fExp, nfExp) } From 5d5badf43f668ac28dcea641bfd377d3f5f3e94c Mon Sep 17 00:00:00 2001 From: Mattia Matteini Date: Sun, 24 Sep 2023 16:50:49 +0200 Subject: [PATCH 4/7] style: format --- .../tseitin/benchmark/ConversionProblemBenchmark.scala | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/test/scala/satify/update/converters/tseitin/benchmark/ConversionProblemBenchmark.scala b/src/test/scala/satify/update/converters/tseitin/benchmark/ConversionProblemBenchmark.scala index 9b6dfced..96e9cc7b 100644 --- a/src/test/scala/satify/update/converters/tseitin/benchmark/ConversionProblemBenchmark.scala +++ b/src/test/scala/satify/update/converters/tseitin/benchmark/ConversionProblemBenchmark.scala @@ -5,13 +5,14 @@ import satify.model.problems.{GraphColoring, NQueens, NurseScheduling} import satify.update.converters.Converter object ConversionProblemBenchmark extends Bench.OfflineReport: - + import satify.update.converters.ConverterType.Tseitin performance of "N-Queens conversion time" in { val sizes: Gen[Int] = Gen.range("size")(1, 10, 1) measure method "N-Queens Conversion" in { using(sizes) in { size => + println(reports.resultDir) Converter(Tseitin).convert(NQueens(size).exp, false) } } From 22a80bf864dd98b5d4cffdbc23432943c2bbf56c Mon Sep 17 00:00:00 2001 From: Mattia Matteini Date: Sun, 24 Sep 2023 18:03:05 +0200 Subject: [PATCH 5/7] refactor: update some doc, modify NQueens fields --- doc/report/4-detailed-design.md | 45 +++++++++--------- doc/report/5-implementation.md | 19 +++----- doc/report/img/problem/problem.png | Bin 77968 -> 0 bytes doc/report/img/problem/problem.svg | 2 +- .../satify/model/problems/GraphColoring.scala | 1 + .../scala/satify/model/problems/NQueens.scala | 10 ++-- .../model/problems/NurseScheduling.scala | 1 + .../scala/satify/model/problems/Problem.scala | 2 - 8 files changed, 38 insertions(+), 42 deletions(-) delete mode 100644 doc/report/img/problem/problem.png diff --git a/doc/report/4-detailed-design.md b/doc/report/4-detailed-design.md index 862c10f3..4df09f26 100644 --- a/doc/report/4-detailed-design.md +++ b/doc/report/4-detailed-design.md @@ -1,20 +1,20 @@ # Detailed Design --- + ## Code organization

 Model-View-Update detailed diagram

- ## Architecture As described in the previous section, the architectural pattern used is the **Model-View-Update** (MVU). Moreover, the **Cake Pattern** has been introduced to improve the modeling of the dependencies. Some _trait_ has been designed to represent the components of the MVU pattern, which encapsulate within them some -_abstract type members_ related to Model, View and Update. +_abstract type members_ related to `Model`, `View` and `Update`.

 Model-View-Update detailed diagram @@ -22,19 +22,18 @@ _abstract type members_ related to Model, View and Update. ## Model -Concretely, the **Model** will be a private implementation of the _trait_ **State**, which contains the following +Concretely, the **Model** is an implementation of the _trait_ **State**, which contains the following abstract types: ### Expression -Expression is represented through a simple _enumeration_ which contains all the possible types of expression: +Expression is represented through a _sum type_ which contains all the possible types of expression: -- **And**. It represents the logical And gate. Takes in input *left* and *right* parameters both of type Expression; -- **Or**. It represents the logical Or gate. Like the And Expression, it takes a *left* and *right* Expressions in - input; -- **Not**. It's the logical Not gate. In this case it takes in input another Expression; -- **Symbol**. It's the basic type of Expression, and can either represents a input variable by specifying its name or a - boolean constant by using a value of type **Bool**. +- `And`, it represents the logical And gate. It takes in input **left** and **right** parameters both of type + Expression. +- `Or`, it represents the logical Or gate. Like the `And`, it takes a **left** and **right** Expressions in input. +- `Not`, it's the logical Not gate. It takes in input another `Expression`. +- `Symbol`, represents an input variable by specifying its name, or a boolean constant by using boolean value. Because of its recursive structure, Expression is a tree data structure, where the inner nodes are either **And**, **Or** or **Not**, and each leaf is a **Symbol**. @@ -47,30 +46,31 @@ Because of its recursive structure, Expression is a tree data structure, where t

-The general Problem representation has been designed with a _trait_ **Problem**. +The general SAT problem representation has been designed with a _trait_ **Problem**. It is composed by: - A set of constraints that must be all satisfied in the solution. -- An expression, which is the reduction of the constraints through an And gate. +- An `Expression`, which is the reduction of the constraints using the `And` operator. -Each problem extends **Problem** using a __case class__, and adds the constraints needed to represent the specific +Each problem extends **Problem** using a _case class_, and adds the constraints needed to represent the specific problem. ### Solution ### CNF -CNF is a specific form of representing logical formulas as a *conjunction* of clauses, where each clause is a -*disjunction* -of literals (variables or their negations). For example: +`CNF` is the data structure representing logical formulas as a *conjunction* of clauses, +where each clause is a *disjunction* of literals (variables or their negations). + +For example: $$ (a \lor c) \land (a \lor \lnot d) $$ -CNF has been modeled a specific type of __Expression__ where: +It is a _sum type_ like `Expression`, but it has the following constraints: -- The **Or** gate cannot contain an **And** in either its *left* and *right* parameter; -- The **And** gate cannot contain an **And** in its *left* parameter; -- The **Not** gate can contain only a **Symbol** parameter; +- The `Or` gate cannot contain an `And` in either its **left** and **right** parameter. +- The `And` gate cannot contain an `And` in its **left** parameter. +- The `Not` gate can contain only a `Symbol` parameter. An _enumeration_ has been used for this type of entity. @@ -141,7 +141,7 @@ So, the best way to design it is decomposing the algorithm following the steps b connectives (AND, OR, NOT) following the transformations listed in the table below. | Operator | Circuit | Expression | Converted | - |----------|-------------------------|-----------------|-------------------------------------------------------------------------------| + |----------|-------------------------|-----------------|-------------------------------------------------------------------------------| | AND | ![](img/AndCircuit.svg) | $X = A \land B$ | $(\lnot A \lor \lnot B \lor X) \land (A \lor \lnot X) \land (B \lor \lnot X)$ | | OR | ![](img/OrCircuit.svg) | $X = A \lor B$ | $(A \lor B \lor \lnot X) \land (\lnot A \lor X) \land (\lnot B \lor X)$ | | NOT | ![](img/NotCircuit.svg) | $X = \lnot A$ | $(\lnot A \lor \lnot X) \land (A \lor X)$ | @@ -247,7 +247,8 @@ For example: $$(b \lor c) \land (\lnot c \lor d) \land (a \lor b \lor e) \land (d \lor b)$$ -In this case, $b$ appears only in positive form, then assigning $b = true$ no other clause will be "penalized", therefore +In this case, $b$ appears only in positive form, then assigning $b = true$ no other clause will be "penalized", +therefore delete all the other clauses where $b$ is included. In other words: if $b$ doesn't appear in negative form inside the formula $F$, assigning $b = true$, the satisfability diff --git a/doc/report/5-implementation.md b/doc/report/5-implementation.md index 191c6e49..9d3ca896 100644 --- a/doc/report/5-implementation.md +++ b/doc/report/5-implementation.md @@ -124,22 +124,23 @@ Despite there aren't too many dependencies in MVU, I decided to use the Cake Pat flexibility. In particular, I made use of the _Self-Type Annotation_ and _Mixin_ mechanisms offered by Scala in order to -manage dependencies between pattern components at compile-time and to create an application instance in a simple and +manage dependencies between architecture components at compile-time and to create an application instance in a simple +and readable way. -`scala +```scala trait MVU extends ModelComponent with ViewComponent with UpdateComponent object Main extends App with MVU -` +``` ### Abstract Modelling -Initially I implemented the components making use of _Abstract Modelling_, +Initially, I implemented the components using _Abstract Modelling_, because at the start of the project I didn't know yet how `Model`, `View` and `Update` should have been concretely implemented. This approach permitted me to focus on high-level design, architecture testing -and to postpone the implementation details. +and to postpone implementation details. I adopted _Abstract Modelling_ approach also when I started to implement the `Model` entity. In fact, I knew that the latter had to be an immutable data structure, @@ -160,13 +161,7 @@ Then, I used _reflection_ to execute the processed input string as a Scala code. The words previously wrapped with quotes are interpreted as strings and implicitly converted to `Symbol` objects. The use of the _extension methods_ allowed me to call methods and compose expressions using the infix notation. -Using an Internal DSL, I obtained free and correct use of parenthesis and automatic error checking. - -[//]: # (### Solver) - -[//]: # (One of the main entities is the `Solver`, it is implemented as a trait containing the `solve` method ) - -[//]: # (overloaded in order to perform also the conversion to CNF using the `Converter`, if the input is not in CNF.) +Using an Internal DSL, I obtained free and correct use of parenthesis and automatic error checking. ## Alberto Paganelli diff --git a/doc/report/img/problem/problem.png b/doc/report/img/problem/problem.png deleted file mode 100644 index 9ba6d8c4eacb8473c0969a64a4928872ae0fa447..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 77968 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 diff --git a/doc/report/img/problem/problem.svg b/doc/report/img/problem/problem.svg index b382b433..58e6f278 100644 --- a/doc/report/img/problem/problem.svg +++ b/doc/report/img/problem/problem.svg @@ -1,4 +1,4 @@ -<< trait >>Problemcontraints: Set[Expression]exp: ExpressiontoString(Assignment)<< case class >>GraphColoringvariables: Seq[Seq[Symbol]]nodeHasExactlyOneColor: ExpressionlinkedNodesHasDifferentColor: Expression<< case class >>NQueensvariables: Seq[Seq[Symbol]]atLeastOneQueen: ExpressionatMostOneQueen: ExpressiondiagConstr: Expression<< case class >>NurseSchedulingvariables: Seq[Seq[Seq[Symbol]]]oneNursePerShift: ExpressionatMostOneShiftPerDay: Expression minShiftsPerNurse: IntmaxShiftsPerNurse: IntminShiftsPerNurseConstraint: ExpressionmaxShiftsPerNurseConstraint: Expression \ No newline at end of file +<< trait >>Problemcontraints: Set[Expression]exp: ExpressiontoString(Assignment)<< case class >>GraphColoringvariables: Seq[Seq[Symbol]]nodeHasExactlyOneColor: ExpressionlinkedNodesHasDifferentColor: Expression<< case class >>NQueensvariables: Seq[Seq[Symbol]]atLeastOneQueenRowsColumns: ExpressionatMostOneQueenRowsColumns: ExpressionatMostOneQueenDiagonals: Expression<< case class >>NurseSchedulingvariables: Seq[Seq[Seq[Symbol]]]oneNursePerShift: ExpressionatMostOneShiftPerDay: ExpressionminShiftsPerNurseConstraint: ExpressionmaxShiftsPerNurseConstraint: Expression \ No newline at end of file diff --git a/src/main/scala/satify/model/problems/GraphColoring.scala b/src/main/scala/satify/model/problems/GraphColoring.scala index eb0f20ef..b2d88ef2 100644 --- a/src/main/scala/satify/model/problems/GraphColoring.scala +++ b/src/main/scala/satify/model/problems/GraphColoring.scala @@ -1,4 +1,5 @@ package satify.model.problems + import satify.model.Assignment import satify.model.expression.Expression import satify.model.expression.Expression.* diff --git a/src/main/scala/satify/model/problems/NQueens.scala b/src/main/scala/satify/model/problems/NQueens.scala index 6c1fd08f..9ace2cbe 100644 --- a/src/main/scala/satify/model/problems/NQueens.scala +++ b/src/main/scala/satify/model/problems/NQueens.scala @@ -21,21 +21,21 @@ case class NQueens(n: Int) extends Problem: yield Symbol(s"x_${i}_$j") /** At least one queen on each row and column */ - private val atLeastOneQueen: Expression = + private val atLeastOneQueenRowsColumns: Expression = val constraint = for i <- 0 until n yield And(atLeastOne(variables(i): _*), atLeastOne(variables.map(row => row(i)): _*)) constraint.reduceLeft(And(_, _)) /** At most one queen on each row and column */ - private val atMostOneQueen: Expression = + private val atMostOneQueenRowsColumns: Expression = val atMostConstraints = for i <- 0 until n yield And(atMostOne(variables(i): _*), atMostOne(variables.map(row => row(i)): _*)) atMostConstraints.reduceLeft(And(_, _)) /** At most one queen on each diagonal */ - private def diagConstr: Expression = + private def atMostOneQueenDiagonals: Expression = val clauses = for i <- 0 until (n - 1) yield @@ -57,8 +57,8 @@ case class NQueens(n: Int) extends Problem: clauses.reduceLeft(And(_, _)) override val constraints: Set[Expression] = - if n > 1 then Set(atLeastOneQueen, atMostOneQueen, diagConstr) - else Set(atLeastOneQueen, atMostOneQueen) + if n > 1 then Set(atLeastOneQueenRowsColumns, atMostOneQueenRowsColumns, atMostOneQueenDiagonals) + else Set(atLeastOneQueenRowsColumns, atMostOneQueenRowsColumns) override def toString(assignment: Assignment): String = @tailrec diff --git a/src/main/scala/satify/model/problems/NurseScheduling.scala b/src/main/scala/satify/model/problems/NurseScheduling.scala index 276dfb4d..5d99cc4a 100644 --- a/src/main/scala/satify/model/problems/NurseScheduling.scala +++ b/src/main/scala/satify/model/problems/NurseScheduling.scala @@ -1,4 +1,5 @@ package satify.model.problems + import satify.model.Assignment import satify.model.expression.Expression import satify.model.expression.Expression.* diff --git a/src/main/scala/satify/model/problems/Problem.scala b/src/main/scala/satify/model/problems/Problem.scala index 6bf2fd87..75e7c7c0 100644 --- a/src/main/scala/satify/model/problems/Problem.scala +++ b/src/main/scala/satify/model/problems/Problem.scala @@ -4,8 +4,6 @@ import satify.model.Assignment import satify.model.expression.Expression import satify.model.expression.Expression.And -import scala.swing.Component - /** Entity representing a SAT problem. */ trait Problem: From 204c5913015527a81fa0c952a8e550d1134936d8 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 24 Sep 2023 16:22:02 +0000 Subject: [PATCH 6/7] docs: Update ScalaDoc --- doc/api/satify/model/cnf/CNF$.html | 8 ++++---- doc/api/satify/model/cnf/CNF.html | 8 ++++---- doc/api/satify/model/expression/Utils$.html | 8 ++++---- doc/api/scripts/searchData.js | 8 ++++---- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/doc/api/satify/model/cnf/CNF$.html b/doc/api/satify/model/cnf/CNF$.html index 8d79a44d..6431d991 100644 --- a/doc/api/satify/model/cnf/CNF$.html +++ b/doc/api/satify/model/cnf/CNF$.html @@ -196,20 +196,20 @@

Extensions

extension (cnf: CNF)(cnf: CNF) -
+
- def printAsDSL(flat: Boolean): String + def asDSL(flat: Boolean): String
-
+
- def printAsFormal(flat: Boolean): String + def asFormal(flat: Boolean): String
diff --git a/doc/api/satify/model/cnf/CNF.html b/doc/api/satify/model/cnf/CNF.html index 00688c50..593265c2 100644 --- a/doc/api/satify/model/cnf/CNF.html +++ b/doc/api/satify/model/cnf/CNF.html @@ -161,12 +161,12 @@

Value members

Concrete methods

-
+
- def printAsDSL(flat: Boolean): String + def asDSL(flat: Boolean): String
@@ -180,12 +180,12 @@

Concrete methods

-
+
- def printAsFormal(flat: Boolean): String + def asFormal(flat: Boolean): String
diff --git a/doc/api/satify/model/expression/Utils$.html b/doc/api/satify/model/expression/Utils$.html index 6eb02dde..c953d9f0 100644 --- a/doc/api/satify/model/expression/Utils$.html +++ b/doc/api/satify/model/expression/Utils$.html @@ -90,20 +90,20 @@

Extensions

extension (exp: Expression)(exp: Expression) -
+
- def printAsDSL(flat: Boolean): String + def asDSL(flat: Boolean): String
-
+
- def printAsFormal(flat: Boolean): String + def asFormal(flat: Boolean): String
diff --git a/doc/api/scripts/searchData.js b/doc/api/scripts/searchData.js index d45315bc..5791d736 100644 --- a/doc/api/scripts/searchData.js +++ b/doc/api/scripts/searchData.js @@ -77,8 +77,8 @@ pages = [{"l":"index.html#","e":false,"i":"","n":"satify","t":"satify","d":"","k {"l":"satify/model/cnf/CNF$$And.html#","e":false,"i":"","n":"And","t":"And(left: Or | Literal, right: And | Or | Literal)","d":"satify.model.cnf.CNF","k":"case","x":""}, {"l":"satify/model/cnf/CNF$$Or.html#","e":false,"i":"","n":"Or","t":"Or(left: Or | Literal, right: Or | Literal)","d":"satify.model.cnf.CNF","k":"case","x":""}, {"l":"satify/model/cnf/CNF$.html#","e":false,"i":"","n":"CNF","t":"CNF","d":"satify.model.cnf","k":"object","x":""}, -{"l":"satify/model/cnf/CNF$.html#printAsDSL-3da","e":false,"i":"extension (cnf: CNF)","n":"printAsDSL","t":"printAsDSL(flat: Boolean): String","d":"satify.model.cnf.CNF","k":"def","x":""}, -{"l":"satify/model/cnf/CNF$.html#printAsFormal-3da","e":false,"i":"extension (cnf: CNF)","n":"printAsFormal","t":"printAsFormal(flat: Boolean): String","d":"satify.model.cnf.CNF","k":"def","x":""}, +{"l":"satify/model/cnf/CNF$.html#asDSL-3da","e":false,"i":"extension (cnf: CNF)","n":"asDSL","t":"asDSL(flat: Boolean): String","d":"satify.model.cnf.CNF","k":"def","x":""}, +{"l":"satify/model/cnf/CNF$.html#asFormal-3da","e":false,"i":"extension (cnf: CNF)","n":"asFormal","t":"asFormal(flat: Boolean): String","d":"satify.model.cnf.CNF","k":"def","x":""}, {"l":"satify/model/errors.html#","e":false,"i":"","n":"satify.model.errors","t":"satify.model.errors","d":"","k":"package","x":""}, {"l":"satify/model/errors/Error.html#","e":false,"i":"","n":"Error","t":"Error(val description: String)","d":"satify.model.errors","k":"enum","x":""}, {"l":"satify/model/errors/Error$$InvalidInput.html#","e":false,"i":"","n":"InvalidInput","t":"InvalidInput() extends Error","d":"satify.model.errors.Error","k":"case","x":""}, @@ -126,8 +126,8 @@ pages = [{"l":"index.html#","e":false,"i":"","n":"satify","t":"satify","d":"","k {"l":"satify/model/expression/SymbolGeneration$$SymbolGenerator.html#prefix-0","e":false,"i":"","n":"prefix","t":"prefix: String","d":"satify.model.expression.SymbolGeneration.SymbolGenerator","k":"def","x":""}, {"l":"satify/model/expression/SymbolGeneration$$SymbolGenerator.html#reset-94c","e":false,"i":"","n":"reset","t":"reset(): Unit","d":"satify.model.expression.SymbolGeneration.SymbolGenerator","k":"def","x":""}, {"l":"satify/model/expression/Utils$.html#","e":false,"i":"","n":"Utils","t":"Utils","d":"satify.model.expression","k":"object","x":""}, -{"l":"satify/model/expression/Utils$.html#printAsDSL-d34","e":false,"i":"extension (exp: Expression)","n":"printAsDSL","t":"printAsDSL(flat: Boolean): String","d":"satify.model.expression.Utils","k":"def","x":""}, -{"l":"satify/model/expression/Utils$.html#printAsFormal-d34","e":false,"i":"extension (exp: Expression)","n":"printAsFormal","t":"printAsFormal(flat: Boolean): String","d":"satify.model.expression.Utils","k":"def","x":""}, +{"l":"satify/model/expression/Utils$.html#asDSL-d34","e":false,"i":"extension (exp: Expression)","n":"asDSL","t":"asDSL(flat: Boolean): String","d":"satify.model.expression.Utils","k":"def","x":""}, +{"l":"satify/model/expression/Utils$.html#asFormal-d34","e":false,"i":"extension (exp: Expression)","n":"asFormal","t":"asFormal(flat: Boolean): String","d":"satify.model.expression.Utils","k":"def","x":""}, {"l":"satify/model/problems.html#","e":false,"i":"","n":"satify.model.problems","t":"satify.model.problems","d":"","k":"package","x":""}, {"l":"satify/model/problems/GraphColoring.html#","e":false,"i":"","n":"GraphColoring","t":"GraphColoring(edges: List[(String, String)], nodes: List[String], colors: Int) extends Problem","d":"satify.model.problems","k":"class","x":""}, {"l":"satify/model/problems/GraphColoring.html#constraints-0","e":false,"i":"","n":"constraints","t":"constraints: Set[Expression]","d":"satify.model.problems.GraphColoring","k":"val","x":""}, From c50a6abe694e63749becd3f91f13b3c72c53c7db Mon Sep 17 00:00:00 2001 From: Alberto Paganelli Date: Sun, 24 Sep 2023 18:58:24 +0200 Subject: [PATCH 7/7] docs: modified requirements 3.v --- doc/report/2-requirements.md | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/doc/report/2-requirements.md b/doc/report/2-requirements.md index 18540261..060fec9f 100644 --- a/doc/report/2-requirements.md +++ b/doc/report/2-requirements.md @@ -115,10 +115,8 @@ A problem is represented by a set of constraints which, composed together, form 2. The system has to be user-friendly, providing few and intuitive buttons, help section and flexible input. 3. The system has to be easily extensible with other algorithms for conversion and solving. 4. The system has to be secure, avoiding any kind of code injection through the input. - 5. The system performs efficiently, completing satisfiability checks for various problem instances within acceptable - time limits and depending on the instance dimension. - 6. // TODO: look at req number 5, i think it's ok if linked to scalameter tests (time and memory) - 7. // TODO: performance requirements and tests + 5. The system has to perform efficiently, completing satisfiability checks within acceptable + time limits and depending on the instance dimension conforming to the benchmarks. 4. ## Implementation requirements 1. The system must be implemented in Scala 3, using SBT as automation build tool and JDK 17. @@ -144,7 +142,7 @@ A problem is represented by a set of constraints which, composed together, form | [2.iii](#system-requirements) | [TseitinTest.scala](../../src/test/scala/satify/update/converters/tseitin/TseitinTest.scala) | | [2.iv](#system-requirements) | [DpllEnumerator.scala](../../src/test/scala/satify/update/solver/dpll/impl/DpllEnumeratorTest.scala)
[DpllFinder.scala](../../src/test/scala/satify/update/solver/dpll/impl/DpllFinderTest.scala) | | | | [2.ix](#system-requirements) | [problems package](../../src/test/scala/satify/problems) | -| [3.v](#non-functional-requirements) | [DSL.feature](../../src/test/resources/features/DSL.feature) | +| [3.iv](#non-functional-requirements) | [DSL.feature](../../src/test/resources/features/DSL.feature) | | [3.v](#non-functional-requirements) | [Tseitin Benchmarks](../../src/test/scala/satify/update/converters/tseitin/benchmark)
[DPLL Benchmarks](../../src/test/scala/satify/update/solver/dpll/benchmark) | [Previous](1-methodology.md) | [Next](3-architectural-design.md)