Skip to content

Commit a54a9ac

Browse files
committed
Addressed Array create properly across all DP variations.
works for bottomUp, topDown, topDownMemo in Glossary
1 parent 2e42f25 commit a54a9ac

18 files changed

Lines changed: 296 additions & 103 deletions

File tree

cogen/src/main/scala/org/combinators/cogen/paradigm/ffi/Arrays.scala

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
package org.combinators.cogen.paradigm.ffi /*DI:LI:AI*/
22

3-
import org.combinators.cogen.paradigm.{AnyParadigm, Apply}
4-
import org.combinators.cogen.{Command, Understands}
3+
import org.combinators.cogen.paradigm.{AnyParadigm, Apply, Reify}
4+
import org.combinators.cogen.{Command, TypeRep, Understands}
55
import Command.Generator
66

7-
case class CreateArray[Type](elementType: Type, dimensions: Seq[Int])
7+
// if have contents, must pass in Seq[Int] to be able to group one-dimensional sequence into appropriate sub-structures.
8+
case class CreateArray[Type,Expression](elementType: Type, dimensions: Seq[Expression], contentSpec:Option[(Seq[Int], Seq[Expression])]) extends Command {
9+
override type Result = Expression
10+
}
11+
812
case class Get()
913
case class Set()
1014
case class Length()
@@ -14,9 +18,19 @@ trait Arrays[Context] extends FFI {
1418
import syntax._
1519

1620
trait ArrayCapabilities {
17-
implicit val canCreate: Understands[Context, Apply[CreateArray[Type], Expression, Expression]]
18-
def create(elemTpe: Type, dimensions: Seq[Int], contents: Seq[Expression]): Generator[Context, Expression] =
19-
AnyParadigm.capability(Apply[CreateArray[Type], Expression, Expression](CreateArray(elemTpe, dimensions), contents))
21+
implicit val canCreate: Understands[Context, CreateArray[Type,Expression]]
22+
def create(elemTpe: Type, dimensions: Seq[Expression], contentSpec: Option[(Seq[Int], Seq[Expression])]): Generator[Context, Expression] =
23+
AnyParadigm.capability(CreateArray[Type,Expression](elemTpe, dimensions, contentSpec))
24+
25+
def create(elemTpe: Type, dimensions: Seq[Int], contentSpec: Seq[Expression])
26+
(implicit reify: Understands[Context, Reify[Int, Expression]])
27+
: Generator[Context, Expression] = {
28+
import AnyParadigm.syntax.forEach
29+
for {
30+
dimExps <- forEach(dimensions) { dim => AnyParadigm.capability(Reify[Int, Expression](TypeRep.Int, dim)) }
31+
result <- create(elemTpe, dimExps, Some((dimensions, contentSpec)))
32+
} yield result
33+
}
2034

2135
implicit val canGet: Understands[Context, Apply[Get, Expression, Expression]]
2236
def get(array: Expression, pos:Seq[Expression]): Generator[Context, Expression] =

dynamicProgramming/src/main/scala/org/combinators/archive/cogen/bottomUp/grid/pascalBU/PascalObjectOrientedProvider.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ trait PascalObjectOrientedProvider extends Utility {
7575
(namec,tpec,c) = args.tail.head
7676
rp1 <- arithmetic.arithmeticCapabilities.add(r, one)
7777
cp1 <- arithmetic.arithmeticCapabilities.add(c, one)
78-
instantiated <- ooParadigm.methodBodyCapabilities.instantiateObject(array2dType, Seq(rp1, cp1), None)
78+
instantiated <- array.arrayCapabilities.create(intType /* array2dType */, Seq(rp1, cp1), None)
7979
dpName <- freshName(names.mangle("dp"))
8080
dpVar <- impParadigm.imperativeCapabilities.declareVar(dpName, array2dType, Some(instantiated))
8181

dynamicProgramming/src/main/scala/org/combinators/archive/cogen/bottomUp/oneSequence/fibtest/FibTestObjectOrientedProvider.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ trait FibTestObjectOrientedProvider extends OneSequencesUtility with Utility {
7575
np1 <- arithmetic.arithmeticCapabilities.add(num,one)
7676

7777
//Instantiate
78-
instantiated <- ooParadigm.methodBodyCapabilities.instantiateObject(arrayType, Seq(np1), None)
78+
instantiated <- array.arrayCapabilities.create(intType /* arrayType*/, Seq(np1), None)
7979
dpVar <- impParadigm.imperativeCapabilities.declareVar(names.mangle("dp"), arrayType, Some(instantiated))
8080

8181
//iterator

dynamicProgramming/src/main/scala/org/combinators/archive/cogen/bottomUp/oneSequence/tribonacci/TribonacciObjectOrientedProvider.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ trait TribonacciObjectOrientedProvider extends Utility {
109109
for {
110110
// int[] dp = new int[n + 1];
111111
nValuePlusOne <- arithmetic.arithmeticCapabilities.add(n, one)
112-
instantiated <- ooParadigm.methodBodyCapabilities.instantiateObject(arrayType, Seq(nValuePlusOne), None)
112+
instantiated <- array.arrayCapabilities.create(intType /* arrayType*/, Seq(nValuePlusOne), None)
113113
dpVar <- declare_and_inst_variable("dp", arrayType, instantiated)
114114

115115
// dp[0] = 0;

dynamicProgramming/src/main/scala/org/combinators/archive/cogen/bottomUp/twoSequences/TwoSequencesUtility.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,8 +81,8 @@ trait TwoSequencesUtility extends Utility {
8181

8282
for {
8383
array2dType <- toTargetLanguageType(TypeRep.Array(TypeRep.Array(TypeRep.Int)))
84-
85-
instantiated <- ooParadigm.methodBodyCapabilities.instantiateObject(array2dType, Seq(numRows, numCols), None)
84+
intType <- toTargetLanguageType(TypeRep.Int)
85+
instantiated <- array.arrayCapabilities.create(intType /* array2dType*/, Seq(numRows, numCols), None)
8686

8787
dpVar <- declare_and_inst_variable("dp", array2dType, instantiated)
8888
} yield dpVar

dynamicProgramming/src/main/scala/org/combinators/archive/cogen/bottomUp/twoSequences/longestCommonSubsequence/LongestCommonSubsequenceObjectOrientedProvider.scala

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -100,11 +100,12 @@ trait LongestCommonSubsequenceObjectOrientedProvider extends TwoSequencesUtility
100100
len2 <- declare_and_inst_variable("len2", intType, apply(s2Length, Seq.empty))
101101
len2PlusOne <- arithmetic.arithmeticCapabilities.add(len2, one)
102102

103-
instantiated <- ooParadigm.methodBodyCapabilities.instantiateObject(
104-
array2dType,
105-
Seq(len1PlusOne, len2PlusOne),
106-
None
107-
)
103+
// instantiated <- ooParadigm.methodBodyCapabilities.instantiateObject(
104+
// array2dType,
105+
// Seq(len1PlusOne, len2PlusOne),
106+
// None
107+
// )
108+
instantiated <- array.arrayCapabilities.create(intType /* array2dType*/, Seq(len1PlusOne, len2PlusOne), None)
108109

109110
dp <- declare_and_inst_variable("dp", array2dType, instantiated)
110111

dynamicProgramming/src/main/scala/org/combinators/archive/unenhancedModels/boilerplate/fibonacci/FibonacciProvider.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ trait FibonacciProvider extends DPObjectOrientedProvider {
4545
new TestExample("fib40", new LiteralInt(40), new LiteralInt(102334155), new UnitExpression)
4646
)
4747

48+
println("In FibonacciProvider")
4849
for {
4950
assert_statements <- forEach(tests) { example =>
5051

@@ -61,7 +62,7 @@ trait FibonacciProvider extends DPObjectOrientedProvider {
6162
for {
6263
fibType <- ooParadigm.methodBodyCapabilities.findClass(names.mangle(implementation))
6364
n_value <- paradigm.methodBodyCapabilities.reify(TypeRep.Int, input_value)
64-
sol <- ooParadigm.methodBodyCapabilities.instantiateObject(fibType, Seq(n_value))
65+
sol <- ooParadigm.methodBodyCapabilities.instantiateObject(fibType, Seq(n_value), None)
6566
computeMethod <- ooParadigm.methodBodyCapabilities.getMember(sol, computeName)
6667

6768
intType <- toTargetLanguageType(TypeRep.Int)

dynamicProgramming/src/main/scala/org/combinators/archive/unenhancedModels/boilerplate/unenhancedKnapsack/KnapsackProvider.scala

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import org.combinators.cogen.paradigm.control.Imperative
77
import org.combinators.cogen.paradigm.ffi.{Arithmetic, Arrays, Assertions, Booleans, Console, Equality, RealArithmetic, Strings}
88
import org.combinators.cogen.paradigm.{AnyParadigm, Generics, ObjectOriented, ParametricPolymorphism}
99
import org.combinators.cogen.{AbstractSyntax, NameProvider, TypeRep}
10-
import org.combinators.models.{LiteralExpression, LiteralInt, LiteralString}
10+
import org.combinators.models.{ArgumentType, LiteralExpression, LiteralInt, LiteralString}
1111

1212
/** Any OO approach will need to properly register type mappings and provide a default mechanism for finding a class
1313
* in a variety of contexts. This trait provides that capability
@@ -31,7 +31,10 @@ trait KnapsackProvider extends DPObjectOrientedProvider {
3131
import paradigm._
3232
import syntax._
3333

34-
class KnapsackTestCase(val values:Array[Int], val dim1:Int, val maxWeight: Int) extends LiteralExpression
34+
case class KnapsackInput() extends ArgumentType
35+
class KnapsackTestCase(val values:Array[Int], val dim1:Int, val maxWeight: Int) extends LiteralExpression {
36+
def tpe:ArgumentType = KnapsackInput()
37+
}
3538

3639
// Specific examples hard coded for Int input and Int output
3740
def makeTestsKnapsack(implementation:String, tests: Seq[TestExample] = Seq.empty): Generator[MethodBodyContext, Seq[Expression]] = {

dynamicProgramming/src/main/scala/org/combinators/archive/unenhancedModels/boilerplate/unenhancedUncrossedLines/UnenhancedUncrossedLinesProvider.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ trait UnenhancedUncrossedLinesProvider extends DPObjectOrientedProvider {
6464
ar2 <- create_int_array(input_value._2)
6565

6666
sol <- ooParadigm.methodBodyCapabilities.instantiateObject(fibType, Seq(ar1, ar2))
67+
6768
computeMethod <- ooParadigm.methodBodyCapabilities.getMember(sol, computeName)
6869

6970
intType <- toTargetLanguageType(TypeRep.Int)

dynamicProgramming/src/main/scala/org/combinators/dp/BottomUpStrategy.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ trait BottomUpStrategy extends Utility {
101101
)
102102

103103
// Instantiate 3D array
104-
instantiated <- ooParadigm.methodBodyCapabilities.instantiateObject(arrayType, Seq(mboplus1, mbmplus1, mbiplus1), None)
104+
instantiated <- array.arrayCapabilities.create(intType /* arrayType*/, Seq(mboplus1, mbmplus1, mbiplus1), None)
105105

106106
inner <- explore(first_case._1.get, bottomUp = Some(dp), symbolTable = symbol_table)
107107

@@ -218,7 +218,7 @@ trait BottomUpStrategy extends Utility {
218218
total_map = other_data.foldLeft(Map.empty[String, Expression]) { (acc, a_map) => acc ++ a_map }
219219
oi_map = Map(model.bounds.head.itArgName -> ivar_outer, model.bounds.tail.head.itArgName -> ivar_inner)
220220

221-
instantiated <- ooParadigm.methodBodyCapabilities.instantiateObject(arrayType, Seq(mboplus1,mbiplus1), None)
221+
instantiated <- array.arrayCapabilities.create(intType /* arrayType*/, Seq(mboplus1,mbiplus1), None)
222222
inner <- explore(first_case._1.get, bottomUp = Some(dp), symbolTable = oi_map) // get from Model
223223

224224
all_rest <- forEach(tail_cases) { next_case =>
@@ -317,7 +317,7 @@ trait BottomUpStrategy extends Utility {
317317
dp <- ooParadigm.methodBodyCapabilities.getMember(self, dpName)
318318
dp_i <- array.arrayCapabilities.get(dp, Seq(ivar))
319319

320-
instantiated <- ooParadigm.methodBodyCapabilities.instantiateObject(arrayType, Seq(mbplus1), None)
320+
instantiated <- array.arrayCapabilities.create(intType /* arrayType*/, Seq(mbplus1), None)
321321

322322
inner <- explore(first_case._1.get, bottomUp = Some(dp), symbolTable = Map(model.bounds.head.itArgName -> ivar)) // get from Model
323323

0 commit comments

Comments
 (0)