|
| 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