Skip to content

Commit 0298d2e

Browse files
committed
Update files
1 parent 8812090 commit 0298d2e

File tree

5 files changed

+4679
-0
lines changed

5 files changed

+4679
-0
lines changed

DistributionMomentTruncation.wl

Lines changed: 294 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,294 @@
1+
(* ::Package:: *)
2+
3+
(* ::Title:: *)
4+
(*Queue-SDP-OOP*)
5+
6+
7+
(* ::Subsubsection:: *)
8+
(*Preamble*)
9+
10+
11+
(* ::Input::Initialization:: *)
12+
ResourceFunction[ResourceObject[Association["Name" -> "DarkMode", "ShortName" -> "DarkMode", "UUID" -> "6ae9b15e-dd80-4d11-be6e-434bf9ac9265", "ResourceType" -> "Function", "Version" -> "2.0.0", "Description" -> "Restyle notebooks into dark mode", "RepositoryLocation" -> URL["https://www.wolframcloud.com/objects/resourcesystem/api/1.0"], "SymbolName" -> "FunctionRepository`$f2abd2063089401aafe135eb354a8d92`DarkMode", "FunctionLocation" -> CloudObject["https://www.wolframcloud.com/obj/91755122-26ae-43f1-8e41-4043472dcf8a"]], ResourceSystemBase -> Automatic]];
13+
SetOptions[SelectedNotebook[],PrintingStyleEnvironment->"Printout",ShowSyntaxStyles->True]
14+
ClearAll[Evaluate[ToString[Context[]]<>"*"]]
15+
16+
17+
(* ::Section:: *)
18+
(*Definitions-OOP*)
19+
20+
21+
(* ::Subsection:: *)
22+
(*Related Symbols*)
23+
24+
25+
(* ::Input:: *)
26+
(*Names["*Process*"];*)
27+
28+
29+
(* ::Input:: *)
30+
(*Names["*Distribution*"];*)
31+
32+
33+
(* ::Input:: *)
34+
(*MapThread[Construct,{{f,g,h},{a,b,c}}]*)
35+
36+
37+
(* ::Subsection::Closed:: *)
38+
(*Algebra*)
39+
40+
41+
(* ::Input:: *)
42+
(*ClearAll[Algebra];*)
43+
(*Options[Algebra]={"MultTable"->None,"Generators"->None,"Dimension"->None};*)
44+
(*Algebra[ops:OptionsPattern[]]:=Algebra[canonicalizeAlgebraData[ops]];*)
45+
(*(*do the minimum work necessary to make sure all the data for the Algebra is there*)*)
46+
(*canonicalizeAlgebraData[ops:OptionsPattern[]]:=Association[ops];*)
47+
48+
49+
(* ::Input:: *)
50+
(*(*make some validators so you can always be sure you have a valid algebra without constantly having to check it*)validateAlgebraData[a_Association]:=Length[a]>0;(*reimplement this*)Algebra[a_Association]?NotAlgebraQ:=System`Private`HoldSetValid[Algebra[a]]/;validateAlgebraData[a];*)
51+
(*AlgebraQ[a_Algebra]:=System`Private`HoldValidQ[a];*)
52+
(*AlgebraQ[_]:=False;*)
53+
(*AlgebraQ[s_Symbol]:=(Head[s]===Algebra&&AlgebraQ[Evaluate[s]]);*)
54+
(*AlgebraQ~SetAttributes~HoldFirst;*)
55+
(*NotAlgebraQ[a_]:=Not[AlgebraQ[a]];*)
56+
(*NotAlgebraQ~SetAttributes~HoldFirst;*)
57+
58+
59+
(* ::Input:: *)
60+
(*(*define formatting if you want to*)Format[Algebra[a_]?AlgebraQ,StandardForm]:=RawBoxes@BoxForm`ArrangeSummaryBox[Algebra,Algebra[a],None,{"Put summary info here"},{},StandardForm]*)
61+
62+
63+
(* ::Input:: *)
64+
(*(*define some accessors/methods on your alebgra*)Algebra[a_]?AlgebraQ[k_]:=Lookup[a,k];(*general lookup*)(g:Algebra[a_]?AlgebraQ)["Generators"]:=getAlgebraicGenerators[g];*)
65+
(*(g:Algebra[a_]?AlgebraQ)["Dimensions"]:=getAlgebraDimension[g];*)
66+
67+
68+
(* ::Input:: *)
69+
(*(*define some overloads for your algebra*)Algebra/:Dimensions[a_Algebra?AlgebraQ]:=a["Dimensions"];*)
70+
(*Algebra/:a_Algebra?AlgebraQ[[el_]]:=AlgebraicElement[a,el];(*getting elements*)AlgebraicElement/:NonCommutativeMultiply[AlgebraicElement[a_Algebra?AlgebraQ,el1_],AlgebraicElement[a_Algebra?AlgebraQ,el2_]]:=getAlgebraProduct[a,{el1,el2}];*)
71+
72+
73+
(* ::Input:: *)
74+
(*(*allow for natural modifications of the algebraic structure*)mutateAlgebra[Algebra[a_]?AlgebraQ,changes_Association]:=Algebra[Join[changes,a]];*)
75+
(*mutateAlgebra[a_Algebra,changes_]:=mutateAlgebra[a,Association@changes]*)
76+
(*algebraMutationHandler~SetAttributes~HoldAllComplete;*)
77+
(*algebraMutationHandler[AssociateTo[s_Symbol?AlgebraQ,stuff_]]:=(s=mutateAlgebra[s,stuff]);*)
78+
(*algebraMutationHandler[Set[s_Symbol?AlgebraQ[key_],val_]]:=(s=mutateAlgebra[s,key->val]);*)
79+
(*Language`SetMutationHandler[Algebra,algebraMutationHandler];*)
80+
81+
82+
(* ::Input:: *)
83+
(*(*implement the core algebra calculations some other way*)getAlgebraGenerators[a_Algebra?AlgebraQ]:="Generator, TBD";*)
84+
(*getAlgebraDimension[a_Algebra?AlgebraQ]:="Dimension, TBD";*)
85+
(*getAlgebraProduct[a_Algebra?AlgebraQ,{el1_,el2_}]:="Product, TBD";*)
86+
87+
88+
(* ::Input:: *)
89+
(*a=Algebra["MultTable"->{}]*)
90+
(*(*Out:Algebra[<|"MultTable"\[Rule]{}|>]*)*)
91+
92+
93+
(* ::Subsection:: *)
94+
(*Mine*)
95+
96+
97+
(* ::Input::Initialization:: *)
98+
ClearAll["Global`*"]
99+
100+
101+
(* ::Text:: *)
102+
(*Note : I will follow the paradigm suggested in this post. I propose to implement two wrappers: DistributionMomentTruncation and ProcessMomentTruncation. *)
103+
104+
105+
(* ::Subsubsection:: *)
106+
(*Clearing definitions*)
107+
108+
109+
(* ::Input::Initialization:: *)
110+
ClearAll[DistributionMomentTruncation];
111+
ClearAll[$DistributionDomainCanonicalizer,$DistributionDomainStylizer,$DistributionMomentTruncationSummaryThumbnail];
112+
ClearAll[canonicalizeDistributionMomentTruncation,validateDistributionMomentTruncation,instantiateDistributionMomentTruncation]
113+
ClearAll[DistributionMomentTruncationQ,NotDistributionMomentTruncationQ]
114+
ClearAll[ProcessMomentTruncation,QueueMomentTruncation];
115+
Options[DistributionMomentTruncation]={(*This allow for setting default values; *)
116+
"TruncationOrder"->None,(*major parameter*)
117+
"OriginalDistribution"->None,(*if supplied, the moment sequence is always generated using the moment function of the original distribution; there may be need for memoisation*)
118+
119+
(*"IndependentMargins"\[Rule]None,(*If this is true, MomentData is represented by a matrix only; only meaningful for multi-dimensional distributions, should be set to None for 1-d distributions, and is deleted if IdenticalMargins is True.*)
120+
"IdenticalMargins"\[Rule]None,(*If this is true, MomentData can be represented as a vector; only meaningful for multi-dimensional distributions should be set to None for 1-d distributions.*)*)
121+
"MarginalProperty"->None,
122+
"MomentForm"->"Moment",(*following the specification of MomentConvert, absolute, factorial, central moments and cumulants; may also support truncated probability sequence for *)
123+
"MomentData"->None,(*an association (is this really a good idea?) of the moments, with (lists of) non negative integers as keys; an all-zero key can be used to denote an alternative unitisation (a single zero can be used as a shorthand). not instantiated if there is an original distribution.*)(*I decide that we should only support two types of moment data; see "MomentDataShape" below*)
124+
"MomentDataShape"->None,(*allowed types are "Full", "Overall" and "Function"; "Full" should be assumed. If IndependentMargins is True, this specification is ignored; only meaningful for multi-dimensional distributions, should be set to None for 1-d distributions. not instantiated if there is an original distribution.*)
125+
(*"Dimensions"\[Rule]None,(*is this really needed?*)*)
126+
"Domain"->None(*"DistributionDomain"\[Rule]None,*)(*These two should always be synonymous; the latter should not be stored, but only handled in interfaces. We must handle conversions between "domains" and "intervals/spans"*)
127+
(*,"SummaryThumbnail"\[Rule]None*)(*Default to a plot of the moment matched polynomial; if there is an original distribution, it will also be plotted so that their difference is clearly seen. When any of these are hard to evaluate, a default thumbnail will be shown; this may should not be part of the structure, since it is expensive to store.*)
128+
};
129+
130+
131+
(* ::Subsubsection:: *)
132+
(*Initializers*)
133+
134+
135+
(* ::ItemNumbered:: *)
136+
(*From a distribution*)
137+
138+
139+
(* ::Input::Initialization:: *)
140+
DistributionMomentTruncation[dist_?DistributionParameterQ]:=dist
141+
DistributionMomentTruncation[dist_?DistributionParameterQ,type:"Moment"|"FactorialMoment"|"CentralMoment"|"Cumulant"][r_]:=Symbol[type][dist,r]
142+
143+
DistributionMomentTruncation[trunc_Integer?Positive|trunc_Symbol|trunc:Infinity,type:"Moment"|"FactorialMoment"|"CentralMoment"|"Cumulant":"Moment",ops:OptionsPattern[]][dist_?DistributionParameterQ]:=DistributionMomentTruncation[trunc,dist,type,ops]
144+
DistributionMomentTruncation[trunc_Integer?Positive|trunc_Symbol,dist_?DistributionParameterQ,type:"Moment"|"FactorialMoment"|"CentralMoment"|"Cumulant":"Moment",ops:OptionsPattern[]]:=DistributionMomentTruncation[trunc,dist,"MomentForm"->type,Sequence@@FilterRules[{ops},Except["TruncationOrder"|"OriginalDistribution"|"MomentForm"|"MomentData"|"MomentDataShape"]]]
145+
DistributionMomentTruncation[trunc_Integer?Positive|trunc_Symbol,dist_?DistributionParameterQ,ops:OptionsPattern[]]:=DistributionMomentTruncation["TruncationOrder"->trunc,"OriginalDistribution"->dist,Sequence@@FilterRules[{ops},Except["TruncationOrder"|"OriginalDistribution"|"MomentData"|"MomentDataShape"]]]
146+
DistributionMomentTruncation[Infinity,dist_?DistributionParameterQ,ops:OptionsPattern[]]:=dist(*when a distribution is not moment truncated, it gets cast into the original distribution*)
147+
148+
149+
(* ::ItemNumbered:: *)
150+
(*From a moment function*)
151+
152+
153+
(* ::Input::Initialization:: *)
154+
DistributionMomentTruncation[trunc_Integer?Positive|trunc_Symbol|trunc:Infinity,moments_Function|moments_Symbol,type:"Moment"|"FactorialMoment"|"CentralMoment"|"Cumulant":"Moment",ops:OptionsPattern[]]:=DistributionMomentTruncation[
155+
trunc,moments,"MomentForm"->type,Sequence@@FilterRules[{ops},Except["TruncationOrder"|"OriginalDistribution"|"MomentForm"|"MomentData"|"MomentDataShape"]]]
156+
DistributionMomentTruncation[trunc_Integer?Positive|trunc_Symbol|trunc:Infinity,moments_Function|moments_Symbol,ops:OptionsPattern[]]:=DistributionMomentTruncation["TruncationOrder"->trunc,"MomentData"->moments,"MomentDataShape"->"Function",Sequence@@FilterRules[{ops},Except["TruncationOrder"|"OriginalDistribution"|"MomentData"|"MomentDataShape"]]]
157+
158+
159+
(* ::ItemNumbered:: *)
160+
(*From a moment array*)
161+
162+
163+
(* ::Input::Initialization:: *)
164+
DistributionMomentTruncation[moments_?VectorQ,ops:OptionsPattern[{"Domain"->Interval[{-\[Infinity],\[Infinity]}],DistributionMomentTruncation}]]:=DistributionMomentTruncation["TruncationOrder"->Length[moments],"MomentData"->moments,"Domain"->OptionValue["Domain"],If[!MatchQ[OptionValue["Domain"],_Interval|_Span](*one dimensional*),"MarginalProperty"->"Identical",Unevaluated@Sequence[]],Sequence@@FilterRules[{ops},Except["TruncationOrder"|"OriginalDistribution"|"MomentData"|"Domain"|"MarginalProperty"]]](*default to a 1-d distribution*)
165+
DistributionMomentTruncation[moments_?MatrixQ,ops:OptionsPattern[{"Domain"->None,DistributionMomentTruncation}]]:=(*This is for independent margins*)Module[{domain=OptionValue["Domain"]},
166+
If[SquareMatrixQ[moments]&&Not@MatchQ[OptionValue["MarginalProperty"],"Identical"|"Independent"]&&
167+
(OptionValue["MomentDataShape"]==="Full"||
168+
(MatchQ[domain,{_Interval|_Span,_Interval|_Span}]&&Length[moments]>2)),(*handle the case when the distribution happens to be 2-d*)
169+
If[domain===None,domain=Table[Interval[{-\[Infinity],\[Infinity]}],2]];
170+
DistributionMomentTruncation[
171+
"TruncationOrder"->Length[moments]-1(*note this*),"MomentData"->moments,"Domain"->domain,"MarginalProperty"->None,Sequence@@FilterRules[{ops},Except["TruncationOrder"|"OriginalDistribution"|"MomentData"|"Domain"|"MarginalProperty"]]
172+
],
173+
If[domain===None,domain=Table[Interval[{-\[Infinity],\[Infinity]}],Length[moments]]];
174+
DistributionMomentTruncation[
175+
"TruncationOrder"->Length[moments],"MomentData"->moments,"Domain"->domain,"MarginalProperty"->"Independent",Sequence@@FilterRules[{ops},Except["TruncationOrder"|"OriginalDistribution"|"MomentData"|"Domain"|"MarginalProperty"]]
176+
]
177+
]
178+
]
179+
DistributionMomentTruncation[moments_?ArrayQ,ops:OptionsPattern[{"Domain"->None,DistributionMomentTruncation}]]:=(*currently, only "MomentDataShape"\[Rule]"Full" is supported*)
180+
Module[{domain=If[OptionValue["Domain"]===None,Table[Interval[{-\[Infinity],\[Infinity]}],ArrayDepth[moments]]]},
181+
DistributionMomentTruncation[
182+
"TruncationOrder"->Length[moments]-1(*note this*),"MomentData"->moments,"MomentDataShape"->"Full","Domain"->domain,"MarginalProperty"->None,Sequence@@FilterRules[{ops},Except["TruncationOrder"|"OriginalDistribution"|"MomentData"|"Domain"|"MarginalProperty"]]
183+
]
184+
]
185+
DistributionMomentTruncation[ops:OptionsPattern[]]:=DistributionMomentTruncation[canonicalizeDistributionMomentTruncation[ops]]
186+
187+
188+
(* ::Item:: *)
189+
(*Canonicalize the Truncation*)
190+
191+
192+
(* ::Input::Initialization:: *)
193+
(*do the minimum work necessary to make sure all the data for the DistributionMomentTruncation is there*)
194+
DistributionMomentTruncation::nocanon="Cannot construct a valid DistributionMomentTruncation from the given options `1`.";
195+
DistributionMomentTruncation::noentry="Cannot construct a valid DistributionMomentTruncation because the entry `1` is not provided and cannot be inferred.";
196+
DistributionMomentTruncation::noimplm="The required feature `1` is not implemented yet.";
197+
$DistributionDomainCanonicalizer=Dispatch@{
198+
Reals->Interval[{-\[Infinity],\[Infinity]}],Integers->(-\[Infinity];;\[Infinity]),
199+
NonNegativeReals->Interval[{0,\[Infinity]}],NonPositiveReals->Interval[{-\[Infinity],0}],
200+
NonNegativeIntegers->(0;;\[Infinity]),NonPositiveIntegers->(-\[Infinity];;0),
201+
PositiveIntegers->(1;;\[Infinity]),NegativeIntegers->(-\[Infinity];;-1)};
202+
canonicalizeDistributionMomentTruncation[ops:OptionsPattern[DistributionMomentTruncation]]:=Which[
203+
Length@{ops}<1,Message[DistributionMomentTruncation::nocanon,{ops}];$Failed,
204+
OptionValue["MomentDataShape"]==="Function"&&(OptionValue["Domain"]===None),Message[DistributionMomentTruncation::noentry,{"Domain"}];$Failed,
205+
True,Module[{truncdata={ops}},
206+
If [OptionValue["MomentDataShape"]==="Overall",
207+
Message[DistributionMomentTruncation::noimplm,"MomentDataShape"->"Overall"];AppendTo[truncdata,"MomentDataShape"->"Full"]];
208+
AppendTo[truncdata,"Domain"->OptionValue["Domain"]/.$DistributionDomainCanonicalizer];
209+
If [DistributionParameterQ[OptionValue["OriginalDistribution"]],AppendTo[truncdata,"Domain"->DistributionDomain[OptionValue["OriginalDistribution"]]]];
210+
AppendTo[truncdata,"MomentForm"->OptionValue["MomentForm"]];
211+
Sort@Association[truncdata]
212+
]
213+
]
214+
215+
216+
(* ::Subsubsection:: *)
217+
(*Validators*)
218+
219+
220+
(* ::Input::Initialization:: *)
221+
(*make some validators so you can always be sure you have a valid DistributionMomentTruncation without constantly having to check it*)validateDistributionMomentTruncation[assoc_Association]:=And[
222+
Length[assoc]>0,KeyMemberQ["TruncationOrder"]
223+
](*reimplement this*)
224+
DistributionMomentTruncation[assoc_Association]?NotDistributionMomentTruncationQ:=System`Private`HoldSetValid[DistributionMomentTruncation[assoc]]/;validateDistributionMomentTruncation[assoc];
225+
DistributionMomentTruncationQ[distrlx_DistributionMomentTruncation]:=System`Private`HoldValidQ[distrlx];
226+
DistributionMomentTruncationQ[_]:=False;
227+
DistributionMomentTruncationQ[symbol_Symbol]:=(Head[symbol]===DistributionMomentTruncation&&DistributionMomentTruncationQ[Evaluate[symbol]]);
228+
DistributionMomentTruncationQ~SetAttributes~HoldFirst;
229+
NotDistributionMomentTruncationQ[distrlx_]:=Not[DistributionMomentTruncationQ[distrlx]];
230+
NotDistributionMomentTruncationQ~SetAttributes~HoldFirst;
231+
232+
233+
(* ::Input::Initialization:: *)
234+
instantiateDistributionMomentTruncation[distrlx_DistributionMomentTruncation,ops:OptionsPattern[]]:=Missing["NotAvailable"](*Default to na\[IDoubleDot]ve polynomial moment matching; possible alternatives including orthogonal polynomials, piecewise-constant (histogram), point-masses, smooth-kernel distributions.*)
235+
236+
237+
(* ::Subsubsection:: *)
238+
(*Accessors*)
239+
240+
241+
(* ::Input::Initialization:: *)
242+
DistributionMomentTruncation::excdtrnc="The \!\(\*SuperscriptBox[\(`1`\), \(th\)]\) moment exceeds the order of the truncation.";
243+
DistributionMomentTruncation[a_Association]["Moment"][0]:=1
244+
DistributionMomentTruncation[a_Association]["Moment"][r___]/;KeyMemberQ[a,"OriginalDistribution"]:=
245+
(If[Max[r]>a["TruncationOrder"],Message[DistributionMomentTruncation::excdtrnc,r]];Moment[a["OriginalDistribution"],r])
246+
DistributionMomentTruncation[a_Association]["Moment"][r___]/;(a["MomentDataShape"]==="Function"):=
247+
(If[Max[r]>a["TruncationOrder"],Message[DistributionMomentTruncation::excdtrnc,r]];a["MomentData"][r])
248+
DistributionMomentTruncation[a_Association]["Moment"][{r:Repeated[_Integer?Positive,{SequenceCount[a["Domain"],_Interval|_Span]}]}]/;(MatchQ[a,KeyValuePattern["MarginalProperty"->None]]):=(If[If[a["MomentDataShape"]==="Overall",Total,Max][{r}]>a["TruncationOrder"],
249+
Message[DistributionMomentTruncation::excdtrnc,r];Missing["Indeterminate"],
250+
a["MomentData"][[r]]])
251+
DistributionMomentTruncation[a_Association]["Moment"][{r:Repeated[_Integer?Positive,{SequenceCount[a["Domain"],_Interval|_Span]}]}]/;(MatchQ[a,KeyValuePattern["MarginalProperty"->"Independent"]]):=(If[Max[r]>a["TruncationOrder"],
252+
Message[DistributionMomentTruncation::excdtrnc,r];Missing["Indeterminate"],
253+
Times@@MapThread[Construct,{Extract/@{r},a["MomentData"]}]])
254+
DistributionMomentTruncation[a_Association]["Moment"][{r:Repeated[_Integer?Positive,{SequenceCount[a["Domain"],_Interval|_Span]}]}]/;(MatchQ[a,KeyValuePattern["MarginalProperty"->"Identical"]]):=(If[Max[r]>a["TruncationOrder"],
255+
Message[DistributionMomentTruncation::excdtrnc,r];Missing["Indeterminate"],
256+
Times@@a["MomentData"][{r}]])
257+
DistributionMomentTruncation[a_Association]["Moment"][r_Integer?Positive]/;MatchQ[a,KeyValuePattern["Domain"->(_Interval|_Span)]]:=
258+
DistributionMomentTruncation[a]["Moment"][{r}]
259+
DistributionMomentTruncation[a_Association]["Properties"]:=Sort@Keys[a]
260+
DistributionMomentTruncation[a_Association][key___]:=a[key]
261+
262+
263+
(* ::Subsubsection:: *)
264+
(*Formatting*)
265+
266+
267+
(* ::Input::Initialization:: *)
268+
(*define formatting if you want to*)
269+
$DistributionMomentTruncationSummaryThumbnail=DensityPlot[1-Exp[-5 (y-(.2+0.5E^(-8 (x+.5)^2)+1.0E^(-10 (x-.3)^2)))^2],{x,-1.,1.},{y,0,2},PlotRange->{{-1.,1.},{0.,2.}},AspectRatio->1,Frame->None,PlotTheme->"Monochrome"];
270+
$DistributionDomainStylizer=Dispatch[Reverse/@Normal[$DistributionDomainCanonicalizer]];
271+
SyntaxInformation[DistributionMomentTruncation]={"ArgumentsPattern"->{___,OptionsPattern[]},"OptionNames"->ToString/@First/@Options[DistributionMomentTruncation]};
272+
Format[DistributionMomentTruncation[a_Association]?DistributionMomentTruncationQ,StandardForm]:=Block[{},
273+
RawBoxes@BoxForm`ArrangeSummaryBox[DistributionMomentTruncation,DistributionMomentTruncation[a],$DistributionMomentTruncationSummaryThumbnail,{
274+
{BoxForm`MakeSummaryItem[{"TruncationOrder"<>": ",a["TruncationOrder"]},StandardForm],
275+
BoxForm`MakeSummaryItem[{"Domain"<>": ",a["Domain"]/.$DistributionDomainStylizer},StandardForm]},
276+
If[KeyMemberQ[a,"MomentForm"]&&a["MomentForm"]=!="Moment",
277+
{BoxForm`MakeSummaryItem[{"MomentForm"<>": ",a["MomentForm"]},StandardForm],SpanFromLeft},Unevaluated@Sequence[]],
278+
If[KeyMemberQ[a,"OriginalDistribution"],
279+
{BoxForm`MakeSummaryItem[{"OriginalDistribution"<>": ",a["OriginalDistribution"]},StandardForm],SpanFromLeft},Unevaluated@Sequence[]],
280+
If[KeyMemberQ[a,"MarginalProperty"]&&a["MarginalProperty"]=!=None,
281+
{BoxForm`MakeSummaryItem[{"MarginalProperty"<>": ",a["MarginalProperty"]},StandardForm],SpanFromLeft},Unevaluated@Sequence[]]
282+
},{
283+
If[a["MomentForm"]==="Moment",
284+
{BoxForm`MakeSummaryItem[{"MomentForm"<>": ",a["MomentForm"]},StandardForm],SpanFromLeft},Unevaluated@Sequence[]],
285+
If[KeyMemberQ[a,"MomentDataShape"],
286+
{BoxForm`MakeSummaryItem[{"MomentDataShape"<>": ",a["MomentDataShape"]},StandardForm],SpanFromLeft},Unevaluated@Sequence[]],
287+
If[KeyMemberQ[a,"MomentData"],
288+
{BoxForm`MakeSummaryItem[{"MomentData"<>": ",Short@a["MomentData"]},StandardForm],SpanFromLeft},Unevaluated@Sequence[]]
289+
},StandardForm,"Interpretable"->Automatic]
290+
]
291+
292+
293+
(* ::Input:: *)
294+
(*DistributionMomentTruncation[s,s,]*)

0 commit comments

Comments
 (0)