From f341f3728e5ba51742cd44abcb5ccdb0499948b0 Mon Sep 17 00:00:00 2001 From: Benjamin Meyer Date: Sun, 27 Sep 2026 09:51:51 +0200 Subject: [PATCH] Add into cast to remove conversion import --- .scalafmt.conf | 2 +- AGENTS.md | 24 +++++-------- .../dimwit/optimizer/GradientOptimizer.scala | 1 - core/src/main/scala/dimwit/package.scala | 3 -- .../src/main/scala/dimwit/tensor/Tensor.scala | 30 +++------------- .../dimwit/tensor/Tensor0Conversions.scala | 35 +++++++++++++++++++ .../scala/dimwit/tensor/ValueExtensions.scala | 4 +-- .../tensor/tensorops/StructuralOps.scala | 2 -- .../scala/dimwit/autodiff/AutodiffSuite.scala | 1 - core/src/test/scala/dimwit/jax/JitSuite.scala | 1 - .../dimwit/memory/DimWitMemorySuite.scala | 1 - .../optimizer/GradientOptimizerSuite.scala | 1 - .../scala/dimwit/python/PyWrapSuite.scala | 1 - .../dimwit/stats/DistributionSuite.scala | 1 - .../dimwit/tensor/TensorCovarianceSuite.scala | 1 - .../dimwit/tensor/TensorCreationSuite.scala | 1 - .../tensor/TensorOpsBroadcastSuite.scala | 1 - .../tensor/TensorOpsElementwiseSuite.scala | 1 - .../tensor/TensorOpsFunctionalSuite.scala | 1 - .../tensor/TensorOpsReductionSuite.scala | 1 - .../scala/dimwit/tensortree/TreeOfSuite.scala | 1 - docs/quickstart.md | 5 ++- .../src/main/scala/dimwit/basic/KMeans.scala | 1 - .../dimwit/basic/LogisticRegression.scala | 1 - .../complex/VariationalAutoencoder.scala | 1 - .../scala/dimwit/dataset/MNISTLoader.scala | 1 - mdocs/AGENTS.md | 8 +---- mdocs/docs/quickstart.md | 1 - 28 files changed, 55 insertions(+), 77 deletions(-) create mode 100644 core/src/main/scala/dimwit/tensor/Tensor0Conversions.scala diff --git a/.scalafmt.conf b/.scalafmt.conf index 5269137d..cdd2ce11 100644 --- a/.scalafmt.conf +++ b/.scalafmt.conf @@ -1,4 +1,4 @@ -version = "3.9.8" +version = "3.10.3" runner.dialect = scala3 maxColumn = 999 rewrite.scala3.convertToNewSyntax = true diff --git a/AGENTS.md b/AGENTS.md index 2bbce1fd..1ed0002d 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -266,9 +266,7 @@ val descendingSpaced = Tensor1(Axis[A]).linspace(Tensor0(1.0f), Tensor0(0.0f), 3 val samples = Tensor1(Axis[B]).fromArray(Array(4.0f, 2.0f, 8.0f)) val binEdges = Tensor1(Axis[A]).linspace(samples.min, samples.max, 4) -// The typed factory fixes the value type; with dimwit.Conversions.given -// plain literals are converted to Tensor0 of that type -import dimwit.Conversions.given +// The typed factory fixes the value type; plain literals are converted to Tensor0 of that type val halfSpaced = Tensor1(Axis[A], VType[Float16]).linspace(0.0f, 1.0f, 5) ``` @@ -474,10 +472,10 @@ val wrong = t.sum(Axis[C]) // Conflicting definitions: // val t: // dimwit.tensor.Tensor2[MdocApp0.this.A, MdocApp0.this.B, -// dimwit.tensor.DType.Float32] in class MdocApp0 at line 71 and +// dimwit.tensor.DType.Float32] in class MdocApp0 at line 70 and // val t: // dimwit.tensor.Tensor2[MdocApp0.this.A, MdocApp0.this.B, -// dimwit.tensor.DType.Float32] in class MdocApp0 at line 117 +// dimwit.tensor.DType.Float32] in class MdocApp0 at line 116 // ``` @@ -519,10 +517,10 @@ val wrong = t + 5.0f // Use +! instead // Conflicting definitions: // val t: // dimwit.tensor.Tensor2[MdocApp0.this.A, MdocApp0.this.B, -// dimwit.tensor.DType.Float32] in class MdocApp0 at line 71 and +// dimwit.tensor.DType.Float32] in class MdocApp0 at line 70 and // val t: // dimwit.tensor.Tensor2[MdocApp0.this.A, MdocApp0.this.B, -// dimwit.tensor.DType.Float32] in class MdocApp0 at line 126 +// dimwit.tensor.DType.Float32] in class MdocApp0 at line 125 // ``` @@ -612,19 +610,19 @@ val wrong = m1.dot(Axis[B])(m2) // Conflicting definitions: // val m1: // dimwit.tensor.Tensor2[MdocApp1.this.A, MdocApp1.this.B, -// dimwit.tensor.DType.Float32] in class MdocApp1 at line 148 and +// dimwit.tensor.DType.Float32] in class MdocApp1 at line 147 and // val m1: // dimwit.tensor.Tensor2[MdocApp1.this.A, MdocApp1.this.B, -// dimwit.tensor.DType.Float32] in class MdocApp1 at line 151 +// dimwit.tensor.DType.Float32] in class MdocApp1 at line 150 // // error: // Conflicting definitions: // val m2: // dimwit.tensor.Tensor2[MdocApp1.this.B, MdocApp1.this.C, -// dimwit.tensor.DType.Float32] in class MdocApp1 at line 149 and +// dimwit.tensor.DType.Float32] in class MdocApp1 at line 148 and // val m2: // dimwit.tensor.Tensor2[MdocApp1.this.C, MdocApp1.this.D, -// dimwit.tensor.DType.Float32] in class MdocApp1 at line 152 +// dimwit.tensor.DType.Float32] in class MdocApp1 at line 151 // ``` @@ -1007,7 +1005,6 @@ println(s"Block Hessian shapes: ${h_x1x1.shape}, ${h_x1x2.shape}, ${h_x2x1.shape ```scala import dimwit.* -import dimwit.Conversions.given import dimwit.optimizer.{GradientDescent, GradientOptimizer} import dimwit.random.Random @@ -1056,7 +1053,6 @@ val trained = optimizer.iterate(initModelParams)(gradFunc) ```scala import dimwit.optimizer.Lion -import dimwit.Conversions.given // enables implicit conversion from Float to Tensor[V] // Lion optimizer with momentum val lionOptimizer = Lion(learningRate = 1e-3f, beta1 = 0.9f, beta2 = 0.99f, weightDecay = 0.0f) @@ -1071,8 +1067,6 @@ val trainedLion = lionOptimizer.iterate(initModelParams)(gradFunc) ### Complete Training Example: Linear Regression ```scala -import dimwit.Conversions.given // enables implicit conversion from Float to Tensor[V] - // Define problem dimensions trait Sample derives Label trait InputDim derives Label diff --git a/core/src/main/scala/dimwit/optimizer/GradientOptimizer.scala b/core/src/main/scala/dimwit/optimizer/GradientOptimizer.scala index ba038f2e..3950ac8e 100644 --- a/core/src/main/scala/dimwit/optimizer/GradientOptimizer.scala +++ b/core/src/main/scala/dimwit/optimizer/GradientOptimizer.scala @@ -1,7 +1,6 @@ package dimwit.optimizer import dimwit.* -import dimwit.Conversions.given import dimwit.autodiff.* import dimwit.autodiff.Grad import dimwit.tensortree.TreeOf diff --git a/core/src/main/scala/dimwit/package.scala b/core/src/main/scala/dimwit/package.scala index 7d0e7bb5..87ac333f 100644 --- a/core/src/main/scala/dimwit/package.scala +++ b/core/src/main/scala/dimwit/package.scala @@ -101,9 +101,6 @@ package object dimwit: export dimwit.jax.Jit.{jit, jitDonating, jitDonatingUnsafe} export dimwit.jax.EagerCleanup.eagerCleanup - object Conversions: - export dimwit.tensor.Tensor0.{boolean2BooleanTensor, byte2IntegerTensor, short2IntegerTensor, int2IntegerTensor, long2IntegerTensor, float2FloatingTensor, int2FloatingTensor, double2FloatingTensor} - // Export random object export dimwit.random.Random export dimwit.random.Random.Key diff --git a/core/src/main/scala/dimwit/tensor/Tensor.scala b/core/src/main/scala/dimwit/tensor/Tensor.scala index 69e0e0e5..f9af8521 100644 --- a/core/src/main/scala/dimwit/tensor/Tensor.scala +++ b/core/src/main/scala/dimwit/tensor/Tensor.scala @@ -28,7 +28,7 @@ import DType.* * @param T The shape of the tensor, represented as a tuple of axis labels. * @param V The data type of the tensor elements. */ -class Tensor[T <: Tuple: Labels, V] private[dimwit] ( +into class Tensor[T <: Tuple: Labels, V] private[dimwit] ( private[dimwit] val jaxValue: Jax.PyDynamic ): @@ -201,6 +201,10 @@ object Tensor: /** Use the [[LikeFactory]] to create a tensor */ def like[T <: Tuple: Labels, V](template: Tensor[T, V]): LikeFactory[T, V] = LikeFactory(template) + // The conversions from Scala scalars to a Tensor0, e.g. `t *! 2.0f`. Being members of the companion object, they + // are found without an import, and `into class Tensor` allows them without a feature warning. + export Tensor0Conversions.given + // The functions on tensors, e.g. `Tensor.relu(t)` or `Tensor.sum(t, Axis[A])`. // Each one has an extension method with the same name, e.g. `t.relu` or `t.sum(Axis[A])`. export tensorops.ElementWiseOps.* @@ -224,30 +228,6 @@ type Tensor4[L1, L2, L3, L4, V] = Tensor[(L1, L2, L3, L4), V] */ object Tensor0: - given boolean2BooleanTensor[V: IsBoolean]: Conversion[Boolean, Tensor0[V]] with - def apply(value: Boolean): Tensor0[V] = Tensor0(VType[V])(value) - - given byte2IntegerTensor[V: IsInteger]: Conversion[Byte, Tensor0[V]] with - def apply(value: Byte): Tensor0[V] = Tensor0(VType[V])(value) - - given short2IntegerTensor[V: IsInteger]: Conversion[Short, Tensor0[V]] with - def apply(value: Short): Tensor0[V] = Tensor0(VType[V])(value) - - given int2IntegerTensor[V: IsInteger]: Conversion[Int, Tensor0[V]] with - def apply(value: Int): Tensor0[V] = Tensor0(VType[V])(value) - - given int2FloatingTensor[V: IsFloating]: Conversion[Int, Tensor0[V]] with - def apply(value: Int): Tensor0[V] = Tensor0(VType[V])(value.toFloat) - - given long2IntegerTensor[V: IsInteger]: Conversion[Long, Tensor0[V]] with - def apply(value: Long): Tensor0[V] = Tensor0(VType[V])(value) - - given float2FloatingTensor[V: IsFloating]: Conversion[Float, Tensor0[V]] with - def apply(value: Float): Tensor0[V] = Tensor0(VType[V])(value) - - given double2FloatingTensor[V: IsFloating]: Conversion[Double, Tensor0[V]] with - def apply(value: Double): Tensor0[V] = Tensor0(VType[V])(value) - object Value0Factory: def apply(value: Boolean): Tensor0[Bool] = Tensor0(VType[Bool])(value) diff --git a/core/src/main/scala/dimwit/tensor/Tensor0Conversions.scala b/core/src/main/scala/dimwit/tensor/Tensor0Conversions.scala new file mode 100644 index 00000000..9e61771d --- /dev/null +++ b/core/src/main/scala/dimwit/tensor/Tensor0Conversions.scala @@ -0,0 +1,35 @@ +package dimwit.tensor + +import dimwit.tensor.ValueTypeClasses.IsBoolean +import dimwit.tensor.ValueTypeClasses.IsFloating +import dimwit.tensor.ValueTypeClasses.IsInteger + +/** Conversions from Scala scalars to a `Tensor0` of the tensor's value type, e.g. for `t *! 2.0f`. + * + * Users never import them: the `Tensor` companion object exports them, so the compiler finds them automatically. + */ +private[dimwit] object Tensor0Conversions: + + given boolean2BooleanTensor[V: IsBoolean]: Conversion[Boolean, Tensor0[V]] with + def apply(value: Boolean): Tensor0[V] = Tensor0(VType[V])(value) + + given byte2IntegerTensor[V: IsInteger]: Conversion[Byte, Tensor0[V]] with + def apply(value: Byte): Tensor0[V] = Tensor0(VType[V])(value) + + given short2IntegerTensor[V: IsInteger]: Conversion[Short, Tensor0[V]] with + def apply(value: Short): Tensor0[V] = Tensor0(VType[V])(value) + + given int2IntegerTensor[V: IsInteger]: Conversion[Int, Tensor0[V]] with + def apply(value: Int): Tensor0[V] = Tensor0(VType[V])(value) + + given int2FloatingTensor[V: IsFloating]: Conversion[Int, Tensor0[V]] with + def apply(value: Int): Tensor0[V] = Tensor0(VType[V])(value.toFloat) + + given long2IntegerTensor[V: IsInteger]: Conversion[Long, Tensor0[V]] with + def apply(value: Long): Tensor0[V] = Tensor0(VType[V])(value) + + given float2FloatingTensor[V: IsFloating]: Conversion[Float, Tensor0[V]] with + def apply(value: Float): Tensor0[V] = Tensor0(VType[V])(value) + + given double2FloatingTensor[V: IsFloating]: Conversion[Double, Tensor0[V]] with + def apply(value: Double): Tensor0[V] = Tensor0(VType[V])(value) diff --git a/core/src/main/scala/dimwit/tensor/ValueExtensions.scala b/core/src/main/scala/dimwit/tensor/ValueExtensions.scala index a24851a7..688628d9 100644 --- a/core/src/main/scala/dimwit/tensor/ValueExtensions.scala +++ b/core/src/main/scala/dimwit/tensor/ValueExtensions.scala @@ -7,8 +7,8 @@ import dimwit.tensor.tensorops.ElementWiseOps /** Operators with a Scala scalar on the left, e.g. `2.0f *! t` or `3 < t0`. * - * `t op scalar` works through the implicit conversions in [[dimwit.Conversions]], which convert the scalar to a - * `Tensor0` of the tensor's value type. `scalar op t` cannot use them, because Scala does not convert the receiver of + * `t op scalar` works through the implicit conversions exported on the [[Tensor]] companion object, which convert the + * scalar to a `Tensor0` of the tensor's value type. `scalar op t` cannot use them, because Scala does not convert the receiver of * a method call. These extension methods mirror every operator `t op scalar` by asking for the very same conversion, * so both orders compile for exactly the same scalar and value types, and in both the scalar takes the precision of * the tensor. Named methods like `elementEquals` or `and` are deliberately not mirrored: `2.0f.approxEquals(t)` reads diff --git a/core/src/main/scala/dimwit/tensor/tensorops/StructuralOps.scala b/core/src/main/scala/dimwit/tensor/tensorops/StructuralOps.scala index 0c9d405c..1b06d924 100644 --- a/core/src/main/scala/dimwit/tensor/tensorops/StructuralOps.scala +++ b/core/src/main/scala/dimwit/tensor/tensorops/StructuralOps.scala @@ -141,8 +141,6 @@ private[dimwit] object StructuralOps: object AxisAbsent: given notContained[T <: Tuple, L](using NotGiven[Tuple.Contains[T, L] =:= true]): AxisAbsent[T, L] = new AxisAbsent[T, L] {} - import Util.* - object TensorWhere: /** Returns a new tensor selecting elements from `ifTrue` where the condition is true diff --git a/core/src/test/scala/dimwit/autodiff/AutodiffSuite.scala b/core/src/test/scala/dimwit/autodiff/AutodiffSuite.scala index beaeebe3..6ab0afd4 100644 --- a/core/src/test/scala/dimwit/autodiff/AutodiffSuite.scala +++ b/core/src/test/scala/dimwit/autodiff/AutodiffSuite.scala @@ -1,7 +1,6 @@ package dimwit.autodiff import dimwit.* -import dimwit.Conversions.given /** A parameter tree, declared top level so its Mirror is available. */ case class JacParams(w: Tensor1[A, Float32], b: Tensor1[B, Float32]) derives TensorTree diff --git a/core/src/test/scala/dimwit/jax/JitSuite.scala b/core/src/test/scala/dimwit/jax/JitSuite.scala index c244077b..85121a13 100644 --- a/core/src/test/scala/dimwit/jax/JitSuite.scala +++ b/core/src/test/scala/dimwit/jax/JitSuite.scala @@ -1,7 +1,6 @@ package dimwit.jax import dimwit.* -import dimwit.Conversions.given import me.shadaj.scalapy.py class JitSuite extends DimwitTest: diff --git a/core/src/test/scala/dimwit/memory/DimWitMemorySuite.scala b/core/src/test/scala/dimwit/memory/DimWitMemorySuite.scala index 4b4b110a..80307b80 100644 --- a/core/src/test/scala/dimwit/memory/DimWitMemorySuite.scala +++ b/core/src/test/scala/dimwit/memory/DimWitMemorySuite.scala @@ -1,7 +1,6 @@ package dimwit.memory import dimwit.* -import dimwit.Conversions.given import org.scalatest.DoNotDiscover import scala.compiletime.testing.typeCheckErrors import scala.compiletime.ops.double diff --git a/core/src/test/scala/dimwit/optimizer/GradientOptimizerSuite.scala b/core/src/test/scala/dimwit/optimizer/GradientOptimizerSuite.scala index e2b03c5b..85176a3b 100644 --- a/core/src/test/scala/dimwit/optimizer/GradientOptimizerSuite.scala +++ b/core/src/test/scala/dimwit/optimizer/GradientOptimizerSuite.scala @@ -1,7 +1,6 @@ package dimwit.optimizer import dimwit.* -import dimwit.Conversions.given class GradientOptimizerSuite extends DimwitTest: diff --git a/core/src/test/scala/dimwit/python/PyWrapSuite.scala b/core/src/test/scala/dimwit/python/PyWrapSuite.scala index 5ab4b191..7c42b3e2 100644 --- a/core/src/test/scala/dimwit/python/PyWrapSuite.scala +++ b/core/src/test/scala/dimwit/python/PyWrapSuite.scala @@ -1,7 +1,6 @@ package dimwit.python import dimwit.* -import dimwit.Conversions.given import dimwit.python.PyBridge import dimwit.jax.Jax import me.shadaj.scalapy.py diff --git a/core/src/test/scala/dimwit/stats/DistributionSuite.scala b/core/src/test/scala/dimwit/stats/DistributionSuite.scala index 2e14d6b7..c2982fb6 100644 --- a/core/src/test/scala/dimwit/stats/DistributionSuite.scala +++ b/core/src/test/scala/dimwit/stats/DistributionSuite.scala @@ -1,7 +1,6 @@ package dimwit.stats import dimwit.* -import dimwit.Conversions.given import dimwit.jax.Jax import dimwit.random.Random import dimwit.jax.Jax.scipy_stats as jstats diff --git a/core/src/test/scala/dimwit/tensor/TensorCovarianceSuite.scala b/core/src/test/scala/dimwit/tensor/TensorCovarianceSuite.scala index 8ce44e70..398518f3 100644 --- a/core/src/test/scala/dimwit/tensor/TensorCovarianceSuite.scala +++ b/core/src/test/scala/dimwit/tensor/TensorCovarianceSuite.scala @@ -1,7 +1,6 @@ package dimwit.tensor import dimwit.* -import dimwit.Conversions.given import scala.collection.View.Empty class TensorCovarianceSuite extends DimwitTest: diff --git a/core/src/test/scala/dimwit/tensor/TensorCreationSuite.scala b/core/src/test/scala/dimwit/tensor/TensorCreationSuite.scala index 1af10d81..5d6a63e8 100644 --- a/core/src/test/scala/dimwit/tensor/TensorCreationSuite.scala +++ b/core/src/test/scala/dimwit/tensor/TensorCreationSuite.scala @@ -193,7 +193,6 @@ class TensorCreationSuite extends DimwitTest: Tensor1(Axis[A]).linspace(Tensor0(0.0), Tensor0(1.0), 3).dtype shouldBe DType.Float64 it("typed factory fixes the value type and accepts converted literals"): - import dimwit.Conversions.given Tensor1(Axis[A], VType[Float16]).linspace(0.0f, 1.0f, 3).dtype shouldBe DType.Float16 Tensor1(Axis[A], VType[Float32]).linspace(0.0f, 1.0f, 3, endpoint = false) shouldEqual Tensor1(Axis[A]).fromArray(Array(0.0f, 1.0f / 3.0f, 2.0f / 3.0f)) diff --git a/core/src/test/scala/dimwit/tensor/TensorOpsBroadcastSuite.scala b/core/src/test/scala/dimwit/tensor/TensorOpsBroadcastSuite.scala index 43d16682..f50f99a8 100644 --- a/core/src/test/scala/dimwit/tensor/TensorOpsBroadcastSuite.scala +++ b/core/src/test/scala/dimwit/tensor/TensorOpsBroadcastSuite.scala @@ -1,7 +1,6 @@ package dimwit.tensor import dimwit.* -import dimwit.Conversions.given class TensorOpsBroadcastSuite extends DimwitTest: diff --git a/core/src/test/scala/dimwit/tensor/TensorOpsElementwiseSuite.scala b/core/src/test/scala/dimwit/tensor/TensorOpsElementwiseSuite.scala index 2df7d639..e7c033b3 100644 --- a/core/src/test/scala/dimwit/tensor/TensorOpsElementwiseSuite.scala +++ b/core/src/test/scala/dimwit/tensor/TensorOpsElementwiseSuite.scala @@ -1,7 +1,6 @@ package dimwit.tensor import dimwit.* -import dimwit.Conversions.given class TensorOpsElementwiseSuite extends DimwitTest: diff --git a/core/src/test/scala/dimwit/tensor/TensorOpsFunctionalSuite.scala b/core/src/test/scala/dimwit/tensor/TensorOpsFunctionalSuite.scala index 0672eb0f..591fce61 100644 --- a/core/src/test/scala/dimwit/tensor/TensorOpsFunctionalSuite.scala +++ b/core/src/test/scala/dimwit/tensor/TensorOpsFunctionalSuite.scala @@ -1,7 +1,6 @@ package dimwit.tensor import dimwit.* -import dimwit.Conversions.given class TensorOpsFunctionalSuite extends DimwitTest: diff --git a/core/src/test/scala/dimwit/tensor/TensorOpsReductionSuite.scala b/core/src/test/scala/dimwit/tensor/TensorOpsReductionSuite.scala index b04eccac..bae94798 100644 --- a/core/src/test/scala/dimwit/tensor/TensorOpsReductionSuite.scala +++ b/core/src/test/scala/dimwit/tensor/TensorOpsReductionSuite.scala @@ -1,7 +1,6 @@ package dimwit.tensor import dimwit.* -import dimwit.Conversions.given class TensorOpsReductionSuite extends DimwitTest: diff --git a/core/src/test/scala/dimwit/tensortree/TreeOfSuite.scala b/core/src/test/scala/dimwit/tensortree/TreeOfSuite.scala index 0b521bfc..dd3a6af4 100644 --- a/core/src/test/scala/dimwit/tensortree/TreeOfSuite.scala +++ b/core/src/test/scala/dimwit/tensortree/TreeOfSuite.scala @@ -1,7 +1,6 @@ package dimwit.tensortree import dimwit.* -import dimwit.Conversions.given import dimwit.tensortree.TreeOf.* import dimwit.tensortree.TreeOf.given import dimwit.tensortree.TreeOf.ops.* diff --git a/docs/quickstart.md b/docs/quickstart.md index 790cef15..e5f378cf 100644 --- a/docs/quickstart.md +++ b/docs/quickstart.md @@ -11,7 +11,6 @@ Before we start exploring the features of DimWit, let's look at a simple example ```scala // main imports for basic tensor operations and automatic differentiation import dimwit.* -import dimwit.Conversions.given import dimwit.Autodiff.grad // TODO replace with cleaner import after PR is merged import dimwit.optimizer.GradientDescent // TODO replace with cleaner import after refactoring @@ -220,10 +219,10 @@ tensor1 + tensor3 // Conflicting definitions: // val tensor1: // dimwit.tensor.Tensor[(MdocApp1.this.A, MdocApp1.this.B), -// dimwit.tensor.DType.Float32] in class MdocApp1 at line 64 and +// dimwit.tensor.DType.Float32] in class MdocApp1 at line 63 and // val tensor1: // dimwit.tensor.Tensor[(MdocApp1.this.A, MdocApp1.this.B), -// dimwit.tensor.DType.Float32] in class MdocApp1 at line 68 +// dimwit.tensor.DType.Float32] in class MdocApp1 at line 67 // // val tensor1 = Tensor(Shape(Axis[A] -> 3, Axis[B] -> 2)).fill(1.0f) // ^ diff --git a/examples/src/main/scala/dimwit/basic/KMeans.scala b/examples/src/main/scala/dimwit/basic/KMeans.scala index dabec637..9a594c51 100644 --- a/examples/src/main/scala/dimwit/basic/KMeans.scala +++ b/examples/src/main/scala/dimwit/basic/KMeans.scala @@ -1,6 +1,5 @@ package dimwit.examples.basic.kmeans -import dimwit.Conversions.given import dimwit.* import dimwit.random.Random import dimwit.stats.Normal diff --git a/examples/src/main/scala/dimwit/basic/LogisticRegression.scala b/examples/src/main/scala/dimwit/basic/LogisticRegression.scala index 9f7b2bfb..12eee4d3 100644 --- a/examples/src/main/scala/dimwit/basic/LogisticRegression.scala +++ b/examples/src/main/scala/dimwit/basic/LogisticRegression.scala @@ -1,6 +1,5 @@ package dimwit.examples.basic -import dimwit.Conversions.given import dimwit.* import dimwit.autodiff.* import dimwit.optimizer.GradientDescent diff --git a/examples/src/main/scala/dimwit/complex/VariationalAutoencoder.scala b/examples/src/main/scala/dimwit/complex/VariationalAutoencoder.scala index faab4aca..dcfd9817 100644 --- a/examples/src/main/scala/dimwit/complex/VariationalAutoencoder.scala +++ b/examples/src/main/scala/dimwit/complex/VariationalAutoencoder.scala @@ -1,6 +1,5 @@ package dimwit.examples.complex.vae -import dimwit.Conversions.given import dimwit.* import dimwit.tensortree.TreeOf.* import dimwit.autodiff.* diff --git a/examples/src/main/scala/dimwit/dataset/MNISTLoader.scala b/examples/src/main/scala/dimwit/dataset/MNISTLoader.scala index 138c512e..01e5307b 100644 --- a/examples/src/main/scala/dimwit/dataset/MNISTLoader.scala +++ b/examples/src/main/scala/dimwit/dataset/MNISTLoader.scala @@ -1,6 +1,5 @@ package dimwit.examples.dataset -import dimwit.Conversions.given import dimwit.* import me.shadaj.scalapy.py diff --git a/mdocs/AGENTS.md b/mdocs/AGENTS.md index e43be0d7..a0452955 100644 --- a/mdocs/AGENTS.md +++ b/mdocs/AGENTS.md @@ -221,9 +221,7 @@ val descendingSpaced = Tensor1(Axis[A]).linspace(Tensor0(1.0f), Tensor0(0.0f), 3 val samples = Tensor1(Axis[B]).fromArray(Array(4.0f, 2.0f, 8.0f)) val binEdges = Tensor1(Axis[A]).linspace(samples.min, samples.max, 4) -// The typed factory fixes the value type; with dimwit.Conversions.given -// plain literals are converted to Tensor0 of that type -import dimwit.Conversions.given +// The typed factory fixes the value type; plain literals are converted to Tensor0 of that type val halfSpaced = Tensor1(Axis[A], VType[Float16]).linspace(0.0f, 1.0f, 5) ``` @@ -797,7 +795,6 @@ println(s"Block Hessian shapes: ${h_x1x1.shape}, ${h_x1x2.shape}, ${h_x2x1.shape ```scala mdoc:reset:silent import dimwit.* -import dimwit.Conversions.given import dimwit.optimizer.{GradientDescent, GradientOptimizer} import dimwit.random.Random @@ -846,7 +843,6 @@ val trained = optimizer.iterate(initModelParams)(gradFunc) ```scala mdoc:silent import dimwit.optimizer.Lion -import dimwit.Conversions.given // enables implicit conversion from Float to Tensor[V] // Lion optimizer with momentum val lionOptimizer = Lion(learningRate = 1e-3f, beta1 = 0.9f, beta2 = 0.99f, weightDecay = 0.0f) @@ -861,8 +857,6 @@ val trainedLion = lionOptimizer.iterate(initModelParams)(gradFunc) ### Complete Training Example: Linear Regression ```scala mdoc:silent -import dimwit.Conversions.given // enables implicit conversion from Float to Tensor[V] - // Define problem dimensions trait Sample derives Label trait InputDim derives Label diff --git a/mdocs/docs/quickstart.md b/mdocs/docs/quickstart.md index 4037d30c..af10fe65 100644 --- a/mdocs/docs/quickstart.md +++ b/mdocs/docs/quickstart.md @@ -11,7 +11,6 @@ Before we start exploring the features of DimWit, let's look at a simple example ```scala mdoc:silent // main imports for basic tensor operations and automatic differentiation import dimwit.* -import dimwit.Conversions.given import dimwit.Autodiff.grad // TODO replace with cleaner import after PR is merged import dimwit.optimizer.GradientDescent // TODO replace with cleaner import after refactoring