Skip to content

Commit

Permalink
Merge pull request #23 from julianpeeters/dev
Browse files Browse the repository at this point in the history
Fix mermiad rendering of monomial wiring diagrams
  • Loading branch information
julianpeeters committed Jan 21, 2024
2 parents 164d71d + fb92cd9 commit 937a354
Show file tree
Hide file tree
Showing 4 changed files with 41 additions and 42 deletions.
14 changes: 7 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,10 +35,9 @@ import polynomial.product.{◁, ⊗}

type `2y⁵¹²` = Monomial.Interface[(Byte, Boolean), Boolean, _]
type `y² + 2y` = Binomial.Interface[Boolean, Unit, Unit, Boolean, _]
type `y² + 2y + 1` = Trinomial.Interface[Boolean, Unit, Unit, Boolean, Nothing, Unit, _]
type `2y²` = Monomial.Store[Boolean, _]
type `0` = Monomial.Interface[Nothing, Nothing, _]
type `1` = Monomial.Interface[Unit, Unit, _]
type `1` = Monomial.Interface[Unit, Nothing, _]
type `y² + 2y → 2y⁵¹²` = (`y² + 2y` ~> `2y⁵¹²`)[_]
type `4y⁴` = (`2y²` ⊗ `2y²`)[_]
type `8y⁴` = (`2y²` ◁ `2y²`)[_]
Expand All @@ -58,7 +57,7 @@ type `8y⁴` = (`2y²` ◁ `2y²`)[_]
>
>For example, `Binomial` lens can be pameterized by `Option` such that its
>terms are exponentiated by `Some[A]` and `None.type`, and behaves as a
>"dual-laned" monomial lens.
>dual-channeled monomial lens.
### `polynomial-mermaid`

Expand All @@ -76,15 +75,16 @@ import polynomial.`object`.Monomial.{Store, Interface}
import polynomial.mermaid.{Format, Mermaid, given}
import polynomial.morphism.~>

type F[Y] = (Store[Boolean, _] ~> Interface[Byte, Char, _])[Y]
type F[Y] = (Store[Boolean, _] ~> Interface[Int, Int, _])[Y]

val M: Mermaid[F] = summon[Mermaid[F]]
// M: Mermaid[F] = polynomial.mermaid.Mermaid$$anon$1@27d84903
// M: Mermaid[F] = polynomial.mermaid.Mermaid$$anon$1@56887c6

println(M.showGraph(graphFmt = Format.Specific))
println(M.showTitledGraph(titleFmt = Format.Generic, graphFmt = Format.Generic))
// ```mermaid
// graph LR;
// A:::hidden---|<span style="font-family:Courier">Byte</span>|S[<span style="font-family:Courier">Boolean</span>]---|<span style="font-family:Courier">Char</span>|B:::hidden;
// TitleStart[ ]:::hidden~~~TitleBody[<span style="font-family:Courier">S</span>𝑦<sup><span style="font-family:Courier">S</span></sup> → <span style="font-family:Courier">B</span>𝑦<sup><span style="font-family:Courier">A</span></sup>]:::title~~~TitleEnd[ ]:::hidden
// A:::hidden---|<span style="font-family:Courier">A</span>|S[<span style="font-family:Courier">S</span>]---|<span style="font-family:Courier">B</span>|B:::hidden;
//
// classDef empty fill:background;
// classDef point width:0px, height:0px;
Expand Down
9 changes: 4 additions & 5 deletions docs/readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,10 +35,9 @@ import polynomial.product.{◁, ⊗}

type `2y⁵¹²` = Monomial.Interface[(Byte, Boolean), Boolean, _]
type `y² + 2y` = Binomial.Interface[Boolean, Unit, Unit, Boolean, _]
type `y² + 2y + 1` = Trinomial.Interface[Boolean, Unit, Unit, Boolean, Nothing, Unit, _]
type `2y²` = Monomial.Store[Boolean, _]
type `0` = Monomial.Interface[Nothing, Nothing, _]
type `1` = Monomial.Interface[Unit, Unit, _]
type `1` = Monomial.Interface[Unit, Nothing, _]
type `y² + 2y → 2y⁵¹²` = (`y² + 2y` ~> `2y⁵¹²`)[_]
type `4y⁴` = (`2y²` ⊗ `2y²`)[_]
type `8y⁴` = (`2y²` ◁ `2y²`)[_]
Expand All @@ -58,7 +57,7 @@ type `8y⁴` = (`2y²` ◁ `2y²`)[_]
>
>For example, `Binomial` lens can be pameterized by `Option` such that its
>terms are exponentiated by `Some[A]` and `None.type`, and behaves as a
>"dual-laned" monomial lens.
>dual-channeled monomial lens.
### `polynomial-mermaid`

Expand All @@ -76,11 +75,11 @@ import polynomial.`object`.Monomial.{Store, Interface}
import polynomial.mermaid.{Format, Mermaid, given}
import polynomial.morphism.~>

type F[Y] = (Store[Boolean, _] ~> Interface[Byte, Char, _])[Y]
type F[Y] = (Store[Boolean, _] ~> Interface[Int, Int, _])[Y]

val M: Mermaid[F] = summon[Mermaid[F]]

println(M.showGraph(graphFmt = Format.Specific))
println(M.showTitledGraph(titleFmt = Format.Generic, graphFmt = Format.Generic))
```

```mermaid
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -229,19 +229,19 @@ object Mermaid:
def showGraph(graphFmt: Format): String =
graphFmt match
case Cardinal =>
Render.mermaidCodeFence(Q.graphQCardinal((nodeA1, nodeB1))(P.graphPCardinal(labelB1, P.polynomialCardinal)))
Render.mermaidCodeFence(Q.graphQCardinal((nodeA1, nodeB1))(P.graphPCardinal(nodeB1, P.polynomialCardinal)))
case Generic =>
Render.mermaidCodeFence(Q.graphQGeneric((nodeA1, nodeB1), (labelA2, labelB2))(P.graphPGeneric(labelB1, P.polynomialGeneric((labelA1, labelB1)), (labelA1, labelB1))))
Render.mermaidCodeFence(Q.graphQGeneric((nodeA1, nodeB1), (labelA2, labelB2))(P.graphPGeneric(nodeB1, P.polynomialGeneric((labelA1, labelB1)), (labelA1, labelB1))))
case Specific =>
Render.mermaidCodeFence(Q.graphQSpecific((nodeA1, nodeB1))(P.graphPSpecific(labelB1, P.polynomialSpecific)))
Render.mermaidCodeFence(Q.graphQSpecific((nodeA1, nodeB1))(P.graphPSpecific(nodeB1, P.polynomialSpecific)))
def showGraphCustom[Y](graphFmt: Format, labels: (String, String)): String =
graphFmt match
case Cardinal =>
Render.mermaidCodeFence(Q.graphQCardinal((nodeA1, nodeB1))(P.graphPCardinal(labelB1, P.polynomialCardinal)))
Render.mermaidCodeFence(Q.graphQCardinal((nodeA1, nodeB1))(P.graphPCardinal(nodeB1, P.polynomialCardinal)))
case Generic =>
Render.mermaidCodeFence(Q.graphQGeneric((nodeA1, nodeB1), (labelA2, labelB2))(P.graphPGeneric(labelB1, labels._1, (labelA1, labelB1))))
Render.mermaidCodeFence(Q.graphQGeneric((nodeA1, nodeB1), (labelA2, labelB2))(P.graphPGeneric(nodeB1, labels._1, (labelA1, labelB1))))
case Specific =>
Render.mermaidCodeFence(Q.graphQSpecific((nodeA1, nodeB1))(P.graphPSpecific(labelB1, P.polynomialSpecific)))
Render.mermaidCodeFence(Q.graphQSpecific((nodeA1, nodeB1))(P.graphPSpecific(nodeB1, P.polynomialSpecific)))
def showTitle(titleFmt: Format): String =
titleFmt match
case Cardinal =>
Expand All @@ -255,52 +255,52 @@ object Mermaid:
def showTitleHtml(titleFmt: Format): String =
titleFmt match
case Cardinal =>
Render.polyMap(P.graphPCardinal(labelB1, P.polynomialCardinal), Q.graphQCardinal((nodeA1, nodeB1))(P.graphPCardinal(labelB1, P.polynomialCardinal)))
Render.polyMap(P.graphPCardinal(nodeB1, P.polynomialCardinal), Q.graphQCardinal((nodeA1, nodeB1))(P.graphPCardinal(nodeB1, P.polynomialCardinal)))
case Generic =>
Render.polyMap(P.graphPGeneric(labelB1, P.polynomialGeneric((labelA1, labelB1)), (labelA1, labelB1)), Q.graphQGeneric((nodeA1, nodeB1), (labelA2, labelB2))(P.graphPGeneric(labelB1, P.polynomialGeneric((labelA1, labelB1)), (labelA1, labelB1))))
Render.polyMap(P.graphPGeneric(nodeB1, P.polynomialGeneric((labelA1, labelB1)), (labelA1, labelB1)), Q.graphQGeneric((nodeA1, nodeB1), (labelA2, labelB2))(P.graphPGeneric(nodeB1, P.polynomialGeneric((labelA1, labelB1)), (labelA1, labelB1))))
case Specific =>
Render.polyMap(P.graphPSpecific(labelB1, P.polynomialSpecific), Q.graphQSpecific((nodeA1, nodeB1))(P.graphPSpecific(labelB1, P.polynomialSpecific)))
Render.polyMap(P.graphPSpecific(nodeB1, P.polynomialSpecific), Q.graphQSpecific((nodeA1, nodeB1))(P.graphPSpecific(nodeB1, P.polynomialSpecific)))
def showTitleHtmlCustom[Y](labels: (String, String)): String =
Render.polyMap(labels._1, labels._2)
def showTitledGraph(titleFmt: Format, graphFmt: Format): String =
(titleFmt, graphFmt) match
case (Cardinal, Cardinal) =>
Render.mermaidCodeFence(Q.graphQCardinal((nodeA1, nodeB1))(P.graphPCardinal(labelB1, P.polynomialCardinal)))
Render.mermaidCodeFence(Q.graphQCardinal((nodeA1, nodeB1))(P.graphPCardinal(nodeB1, P.polynomialCardinal)))
.addTitle(P.polynomialCardinal, 4, Q.polynomialCardinal, 4)
case (Cardinal, Generic) =>
Render.mermaidCodeFence(Q.graphQGeneric((nodeA1, nodeB1), (labelA2, labelB2))(P.graphPGeneric(labelB1, P.polynomialGeneric((labelA1, labelB1)), (labelA1, labelB1))))
Render.mermaidCodeFence(Q.graphQGeneric((nodeA1, nodeB1), (labelA2, labelB2))(P.graphPGeneric(nodeB1, P.polynomialGeneric((labelA1, labelB1)), (labelA1, labelB1))))
.addTitle(P.polynomialCardinal, 4, Q.polynomialCardinal, 4)
case (Cardinal, Specific) =>
Render.mermaidCodeFence(Q.graphQCardinal((nodeA1, nodeB1))(P.graphPCardinal(labelB1, P.polynomialCardinal)))
Render.mermaidCodeFence(Q.graphQCardinal((nodeA1, nodeB1))(P.graphPCardinal(nodeB1, P.polynomialCardinal)))
.addTitle(P.polynomialSpecific, 4, Q.polynomialSpecific, 4)
case (Generic, Cardinal) =>
Render.mermaidCodeFence(Q.graphQCardinal((nodeA1, nodeB1))(P.graphPCardinal(labelB1, P.polynomialCardinal)))
Render.mermaidCodeFence(Q.graphQCardinal((nodeA1, nodeB1))(P.graphPCardinal(nodeB1, P.polynomialCardinal)))
.addTitle(P.polynomialGeneric((labelA1, labelB1)), 4, Q.polynomialGeneric((labelA2, labelB2)), 4)
case (Generic, Generic) =>
Render.mermaidCodeFence(Q.graphQGeneric((nodeA1, nodeB1), (labelA2, labelB2))(P.graphPGeneric(labelB1, P.polynomialGeneric((labelA1, labelB1)), (labelA1, labelB1))))
Render.mermaidCodeFence(Q.graphQGeneric((nodeA1, nodeB1), (labelA2, labelB2))(P.graphPGeneric(nodeB1, P.polynomialGeneric((labelA1, labelB1)), (labelA1, labelB1))))
.addTitle(P.polynomialGeneric((labelA1, labelB1)), 4, Q.polynomialGeneric((labelA2, labelB2)), 4)
case (Generic, Specific) =>
Render.mermaidCodeFence(Q.graphQSpecific((nodeA1, nodeB1))(P.graphPSpecific(labelB1, P.polynomialSpecific)))
Render.mermaidCodeFence(Q.graphQSpecific((nodeA1, nodeB1))(P.graphPSpecific(nodeB1, P.polynomialSpecific)))
.addTitle(P.polynomialGeneric((labelA1, labelB1)), 4, Q.polynomialGeneric((labelA2, labelB2)), 4)
case (Specific, Cardinal) =>
Render.mermaidCodeFence(Q.graphQSpecific((nodeA1, nodeB1))(P.graphPSpecific(labelB1, P.polynomialSpecific)))
Render.mermaidCodeFence(Q.graphQSpecific((nodeA1, nodeB1))(P.graphPSpecific(nodeB1, P.polynomialSpecific)))
.addTitle(P.polynomialSpecific, 4, Q.polynomialSpecific, 4)
case (Specific, Generic) =>
Render.mermaidCodeFence(Q.graphQGeneric((nodeA1, nodeB1), (labelA2, labelB2))(P.graphPGeneric(labelB1, P.polynomialGeneric((labelA1, labelB1)), (labelA1, labelB1))))
Render.mermaidCodeFence(Q.graphQGeneric((nodeA1, nodeB1), (labelA2, labelB2))(P.graphPGeneric(nodeB1, P.polynomialGeneric((labelA1, labelB1)), (labelA1, labelB1))))
.addTitle(P.polynomialSpecific, 4, Q.polynomialSpecific, 4)
case (Specific, Specific) =>
Render.mermaidCodeFence(Q.graphQSpecific((nodeA1, nodeB1))(P.graphPSpecific(labelB1, P.polynomialSpecific)))
Render.mermaidCodeFence(Q.graphQSpecific((nodeA1, nodeB1))(P.graphPSpecific(nodeB1, P.polynomialSpecific)))
.addTitle(P.polynomialSpecific, 4, Q.polynomialSpecific, 4)
def showTitledGraphCustom[Y](graphFmt: Format, labels: (String, String)): String =
graphFmt match
case Cardinal =>
Render.mermaidCodeFence(Q.graphQCardinal((nodeA1, nodeB1))(P.graphPCardinal(labelB1, P.polynomialCardinal)))
Render.mermaidCodeFence(Q.graphQCardinal((nodeA1, nodeB1))(P.graphPCardinal(nodeB1, P.polynomialCardinal)))
.addTitle(labels._1, 4, labels._2, 4)
case Generic =>
Render.mermaidCodeFence(Q.graphQGeneric((nodeA1, nodeB1), (labelA2, labelB2))(P.graphPGeneric(labelB1, labels._1, (labelA1, labelB1))))
Render.mermaidCodeFence(Q.graphQGeneric((nodeA1, nodeB1), (labelA2, labelB2))(P.graphPGeneric(nodeB1, labels._1, (labelA1, labelB1))))
.addTitle(labels._1, 4, labels._2, 4)
case Specific =>
Render.mermaidCodeFence(Q.graphQSpecific((nodeA1, nodeB1))(P.graphPSpecific(labelB1, P.polynomialSpecific)))
Render.mermaidCodeFence(Q.graphQSpecific((nodeA1, nodeB1))(P.graphPSpecific(nodeB1, P.polynomialSpecific)))
.addTitle(labels._1, 4, labels._2, 4)

given mooreStoreToBi[S, A1, B1, A2, B2](using
Expand Down Expand Up @@ -401,12 +401,12 @@ object Mermaid:
Q2: MermaidQ[Monomial.Interface[A2, B2, _]],
): Mermaid[PolyMap[Monomial.Store[S1, _] ⊗ Monomial.Store[S2, _], Monomial.Interface[A1, B1, _] ⊗ Monomial.Interface[A2, B2, _], _]] =
new Mermaid[PolyMap[Monomial.Store[S1, _] ⊗ Monomial.Store[S2, _], Monomial.Interface[A1, B1, _] ⊗ Monomial.Interface[A2, B2, _], _]]:
private val labelS1 = "S"
private val labelS2 = "T"
private val labelA1 = "A"
private val labelA2 = "C"
private val labelB1 = "B"
private val labelB2 = "D"
private val labelS1 = "S1"
private val labelS2 = "S2"
private val labelA1 = "A1"
private val labelA2 = "A2"
private val labelB1 = "B1"
private val labelB2 = "B2"
private val nodeS1 = "S1"
private val nodeS2 = "S2"
private val nodeA1 = "A1"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,9 +53,9 @@ object MermaidP:
def graphP[Y](nodeLabels: String, polynomialLabelP: String, paramLabelsP: (String, String)): String =
s"""|A_${nodeLabels}[ ]:::point
|subgraph s[ ]
| A_${nodeLabels}:::point---${nodeLabels}
| ${nodeLabels}[${polynomialLabelP}]:::empty
| ${nodeLabels}---B_${nodeLabels}
| A_${nodeLabels}:::point---Q${nodeLabels}
| Q${nodeLabels}[${polynomialLabelP}]:::empty
| Q${nodeLabels}---B_${nodeLabels}
|end
|B_${nodeLabels}[ ]:::point""".stripMargin
def graphPCardinal[Y](nodeLabels: String, polynomialLabelP: String): String =
Expand Down

0 comments on commit 937a354

Please sign in to comment.