mutable/context API

Luna-Flow/luna-poly/mutable/context はミュータブルな ContextPolynomial[A] を提供します。これは immut/context の多項式を保持するセルで、add_inplace、mul_inplace、clear がその値を置き換えます。その他の演算はすべてイミュータブルな実装に委譲され、その意味、失敗ケース、コストを引き継ぎます。

これらの型は mutable ファサードから再エクスポートされており、例ではそれを使います。「immut と同様」は immut/context API を指します。設計は mutable/context の設計 にあります。

型

ContextPolynomial

VariableContext 上のミュータブルな多項式。

type ContextPolynomial[A] derive(@debug.Debug)
pub impl[A : Eq + @luna-generic.AddMonoid] Add for ContextPolynomial[A]
pub impl[A : Eq + @luna-generic.AddMonoid + Neg] Sub for ContextPolynomial[A]
pub impl[A : Eq + @luna-generic.AddMonoid + Mul] Mul for ContextPolynomial[A]
pub impl[A : Eq + @luna-generic.Zero + Neg] Neg for ContextPolynomial[A]
pub impl[A : Show + @luna-generic.Zero] Show for ContextPolynomial[A]
pub impl[A : Eq + @luna-generic.AddMonoid] @core.Clearable for ContextPolynomial[A]
pub impl[A] @core.Copyable for ContextPolynomial[A]
pub impl[A : Eq + @luna-generic.AddMonoid] @core.MutablePolynomial for ContextPolynomial[A]
pub impl[A] @core.ContextualPolynomial for ContextPolynomial[A]
pub impl[A] @core.HasArity for ContextPolynomial[A]
pub impl[A] @core.HasContext for ContextPolynomial[A]
pub impl[A] @core.HasShape for ContextPolynomial[A]
pub impl[A] @core.HasTermCount for ContextPolynomial[A]
pub impl[A] @core.IsZero for ContextPolynomial[A]

ContextSubstitutionValue

1 つの変数の置き換え先: スカラー、または同じコンテキスト上のミュータブルなコンテキスト多項式。イミュータブルな ContextSubstitutionValue とは別の型で、代入を委譲するときに変換されます。

pub(all) enum ContextSubstitutionValue[A] {
  Scalar(A)
  Polynomial(ContextPolynomial[A])
}

構築と変換

ContextPolynomial::from_immut, ContextPolynomial::to_immut

イミュータブルなコンテキスト多項式をラップし、現在保持しているイミュータブルな値を返します。どちらもコピーしません。保持している値はイミュータブルであり、変更操作はそれを書き換えるのではなく置き換えるので、これは安全です。

pub fn[A] ContextPolynomial::from_immut(@Luna-Flow/luna-poly/immut/context.ContextPolynomial[A]) -> Self[A]
pub fn[A] ContextPolynomial::to_immut(Self[A]) -> @Luna-Flow/luna-poly/immut/context.ContextPolynomial[A]

ContextPolynomial::from_named_terms_as_terms, ContextPolynomial::from_named_terms_as_terms_checked, ContextPolynomial::from_named_terms_as_sparse, ContextPolynomial::from_named_terms_as_sparse_checked

immut と同様に、名前付きの項から構築します。

pub fn[A : Eq + @luna-generic.AddMonoid] ContextPolynomial::from_named_terms_as_terms(@Luna-Flow/luna-poly/core.VariableContext, Array[(Array[(@Luna-Flow/luna-poly/core.Variable, UInt)], A)]) -> Self[A]
pub fn[A : Eq + @luna-generic.AddMonoid] ContextPolynomial::from_named_terms_as_terms_checked(@Luna-Flow/luna-poly/core.VariableContext, Array[(Array[(@Luna-Flow/luna-poly/core.Variable, UInt)], A)]) -> Self[A]?
pub fn[A : Eq + @luna-generic.AddMonoid] ContextPolynomial::from_named_terms_as_sparse(@Luna-Flow/luna-poly/core.VariableContext, Array[(Array[(@Luna-Flow/luna-poly/core.Variable, UInt)], A)]) -> Self[A]
pub fn[A : Eq + @luna-generic.AddMonoid] ContextPolynomial::from_named_terms_as_sparse_checked(@Luna-Flow/luna-poly/core.VariableContext, Array[(Array[(@Luna-Flow/luna-poly/core.Variable, UInt)], A)]) -> Self[A]?

ContextPolynomial::from_term_polynomial, ContextPolynomial::from_sparse_polynomial

ミュータブルな 項または疎な多項式をコンテキストに束縛します。多項式はイミュータブルな形式に変換されるため、後で引数を変更しても結果には影響しません。immut と同様に、アリティはコンテキストのサイズと照合されません。

pub fn[A : Eq + @luna-generic.AddMonoid] ContextPolynomial::from_term_polynomial(@Luna-Flow/luna-poly/core.VariableContext, @term.TermPolynomial[A]) -> Self[A]
pub fn[A : Eq + @luna-generic.AddMonoid] ContextPolynomial::from_sparse_polynomial(@Luna-Flow/luna-poly/core.VariableContext, @sparse.SparsePolynomial[A]) -> Self[A]

ContextPolynomial::constant, ContextPolynomial::variable, ContextPolynomial::variable_checked

immut と同様です。

pub fn[A : Eq + @luna-generic.AddMonoid] ContextPolynomial::constant(@Luna-Flow/luna-poly/core.VariableContext, A) -> Self[A]
pub fn[A : Eq + @luna-generic.AddMonoid + @luna-generic.One] ContextPolynomial::variable(@Luna-Flow/luna-poly/core.VariableContext, @Luna-Flow/luna-poly/core.Variable) -> Self[A]
pub fn[A : Eq + @luna-generic.AddMonoid + @luna-generic.One] ContextPolynomial::variable_checked(@Luna-Flow/luna-poly/core.VariableContext, @Luna-Flow/luna-poly/core.Variable) -> Self[A]?

ContextPolynomial::copy

同じイミュータブルな値を保持する新しいセルを O(1)O(1) で返します(Copyable::copy でもあります)。以後どちらのセルを変更しても、もう一方には影響しません。

pub fn[A] ContextPolynomial::copy(Self[A]) -> Self[A]

問い合わせと変換

ContextPolynomial::context, ContextPolynomial::to_terms, ContextPolynomial::term_count, ContextPolynomial::arity, ContextPolynomial::is_zero, ContextPolynomial::shape, ContextPolynomial::to_string

immut と同様です。

pub fn[A] ContextPolynomial::context(Self[A]) -> @Luna-Flow/luna-poly/core.VariableContext
pub fn[A] ContextPolynomial::to_terms(Self[A]) -> Array[(@Luna-Flow/luna-poly/core.ExponentVector, A)]
pub fn[A] ContextPolynomial::term_count(Self[A]) -> Int
pub fn[A] ContextPolynomial::arity(Self[A]) -> Int
pub fn[A] ContextPolynomial::is_zero(Self[A]) -> Bool
pub fn[A] ContextPolynomial::shape(Self[A]) -> @Luna-Flow/luna-poly/core.PolynomialShape
pub fn[A : Show + @luna-generic.Zero] ContextPolynomial::to_string(Self[A]) -> String

ContextPolynomial::to_term_polynomial, ContextPolynomial::to_sparse_polynomial

現在の項を持つ新しい ミュータブルな 項または疎な多項式を返します。

pub fn[A : Eq + @luna-generic.AddMonoid] ContextPolynomial::to_term_polynomial(Self[A]) -> @term.TermPolynomial[A]
pub fn[A : Eq + @luna-generic.AddMonoid] ContextPolynomial::to_sparse_polynomial(Self[A]) -> @sparse.SparsePolynomial[A]

評価と代入

ContextPolynomial::eval, ContextPolynomial::eval_checked, ContextPolynomial::eval_named, ContextPolynomial::eval_named_checked

immut と同様です。

pub fn[A : @luna-generic.AddMonoid + Mul + @luna-generic.One] ContextPolynomial::eval(Self[A], Array[A]) -> A
pub fn[A : @luna-generic.AddMonoid + Mul + @luna-generic.One] ContextPolynomial::eval_checked(Self[A], Array[A]) -> A?
pub fn[A : @luna-generic.AddMonoid + Mul + @luna-generic.One] ContextPolynomial::eval_named(Self[A], Array[(@Luna-Flow/luna-poly/core.Variable, A)]) -> A
pub fn[A : @luna-generic.AddMonoid + Mul + @luna-generic.One] ContextPolynomial::eval_named_checked(Self[A], Array[(@Luna-Flow/luna-poly/core.Variable, A)]) -> A?

ContextPolynomial::eval_partial, ContextPolynomial::eval_partial_checked, ContextPolynomial::eval_partial_named, ContextPolynomial::eval_partial_named_checked

部分評価です。immut と同様に、同じコンテキスト上の新しいミュータブルな多項式を返します。

pub fn[A : Eq + @luna-generic.AddMonoid + Mul + @luna-generic.One] ContextPolynomial::eval_partial(Self[A], Array[(@Luna-Flow/luna-poly/core.Variable, A)]) -> Self[A]
pub fn[A : Eq + @luna-generic.AddMonoid + Mul + @luna-generic.One] ContextPolynomial::eval_partial_checked(Self[A], Array[(@Luna-Flow/luna-poly/core.Variable, A)]) -> Self[A]?
pub fn[A : Eq + @luna-generic.AddMonoid + Mul + @luna-generic.One] ContextPolynomial::eval_partial_named(Self[A], Array[(@Luna-Flow/type_theory/core.Name, A)]) -> Self[A]
pub fn[A : Eq + @luna-generic.AddMonoid + Mul + @luna-generic.One] ContextPolynomial::eval_partial_named_checked(Self[A], Array[(@Luna-Flow/type_theory/core.Name, A)]) -> Self[A]?

ContextPolynomial::substitute, ContextPolynomial::substitute_checked, ContextPolynomial::substitute_names, ContextPolynomial::substitute_names_checked

同じコンテキスト上のスカラーまたはミュータブルな多項式による同時代入です。immut と同様に、新しいミュータブルな多項式を返します。

pub fn[A : Eq + @luna-generic.AddMonoid + Mul + @luna-generic.One] ContextPolynomial::substitute(Self[A], Array[(@Luna-Flow/luna-poly/core.Variable, ContextSubstitutionValue[A])]) -> Self[A]
pub fn[A : Eq + @luna-generic.AddMonoid + Mul + @luna-generic.One] ContextPolynomial::substitute_checked(Self[A], Array[(@Luna-Flow/luna-poly/core.Variable, ContextSubstitutionValue[A])]) -> Self[A]?
pub fn[A : Eq + @luna-generic.AddMonoid + Mul + @luna-generic.One] ContextPolynomial::substitute_names(Self[A], Array[(@Luna-Flow/type_theory/core.Name, ContextSubstitutionValue[A])]) -> Self[A]
pub fn[A : Eq + @luna-generic.AddMonoid + Mul + @luna-generic.One] ContextPolynomial::substitute_names_checked(Self[A], Array[(@Luna-Flow/type_theory/core.Name, ContextSubstitutionValue[A])]) -> Self[A]?

算術演算と変更操作

ContextPolynomial::add_inplace, ContextPolynomial::mul_inplace

保持している値を self + other または self * other で置き換えます。コンテキストが異なると中断 (abort) します。ミュータブルな型にはチェック付き版はありません(ops().add_checked、または to_immut を経由してイミュータブルな add_checked を使ってください)。

pub fn[A : Eq + @luna-generic.AddMonoid] ContextPolynomial::add_inplace(Self[A], Self[A]) -> Unit
pub fn[A : Eq + @luna-generic.AddMonoid + Mul] ContextPolynomial::mul_inplace(Self[A], Self[A]) -> Unit

ContextPolynomial::clear

保持している値を、同じコンテキスト上のゼロ多項式で置き換えます(Clearable::clear でもあります)。

pub fn[A : Eq + @luna-generic.AddMonoid] ContextPolynomial::clear(Self[A]) -> Unit

ContextPolynomial::add, ContextPolynomial::sub, ContextPolynomial::mul, ContextPolynomial::neg, ContextPolynomial::pow

immut と同様に、新しいセルを返す演算子と累乗です。二項演算子はコンテキストが異なると中断 (abort) します。

pub fn[A : Eq + @luna-generic.AddMonoid] ContextPolynomial::add(Self[A], Self[A]) -> Self[A]
pub fn[A : Eq + @luna-generic.AddMonoid + Neg] ContextPolynomial::sub(Self[A], Self[A]) -> Self[A]
pub fn[A : Eq + @luna-generic.AddMonoid + Mul] ContextPolynomial::mul(Self[A], Self[A]) -> Self[A]
pub fn[A : Eq + @luna-generic.Zero + Neg] ContextPolynomial::neg(Self[A]) -> Self[A]
pub fn[A : Eq + @luna-generic.AddMonoid + Mul + @luna-generic.One] ContextPolynomial::pow(Self[A], UInt) -> Self[A]

ContextPolynomial::ops

ContextOps レコードです。その add_checked と mul_checked は、コンテキストが異なる場合に None を返します。

pub fn[A : Eq + @luna-generic.AddMonoid + Mul + @luna-generic.One] ContextPolynomial::ops() -> @Luna-Flow/luna-poly/core.ContextOps[Self[A], A]
test "mutable context" {
  let ctx = @mutable.VariableContext::from_names(["x", "y"])
  let x = ctx.require_variable("x")
  let y = ctx.require_variable("y")
  let p = @mutable.ContextPolynomial::from_named_terms_as_sparse(ctx, [([(x, 1U)], 2)])
  let before = p.copy()
  p.add_inplace(@mutable.ContextPolynomial::from_named_terms_as_terms(ctx, [([(y, 1U)], 1)]))
  inspect(p, content="2 * x + 1 * y")
  inspect(before, content="2 * x")
  let y_poly = @mutable.ContextPolynomial::variable(ctx, y)
  inspect(p.substitute([(x, Polynomial(y_poly))]), content="3 * y")
  inspect(p.eval_named([(x, 1), (y, 1)]), content="3")
  p.clear()
  assert_true(p.is_zero())
  inspect(p.context(), content="VariableContext(x, y)")
}

非推奨

ソース互換性のために残されている、隠されたメソッド形式:

非推奨代替
p.output(logger)to_string または文字列補間
p.to_repr()Repr(p) または debug_inspect