From a1e155d5f72f8d3dd3dd383c29821d1729655ccc Mon Sep 17 00:00:00 2001 From: hzhang Date: Tue, 10 Dec 2024 18:57:29 +0000 Subject: [PATCH] Add: readme --- README.md | 151 ++++++++++++++++++++++++++++++++++++++++++++++++ Skeleton.csproj | 5 +- license | 22 +++++++ src/Algebra.zip | Bin 46133 -> 0 bytes 4 files changed, 177 insertions(+), 1 deletion(-) create mode 100644 README.md create mode 100644 license delete mode 100644 src/Algebra.zip diff --git a/README.md b/README.md new file mode 100644 index 0000000..87834e9 --- /dev/null +++ b/README.md @@ -0,0 +1,151 @@ +# Skeleton Framework + +Skeleton is a computational library built with .NET 8.0, primarily designed to handle special complex matrices of small sizes (like 3x3) but supports matrices of any dimension over any custom field. +Other modules such as morphisms, groups, rings, and fields are under development. + +## Features + +- Vector and Matrix operations +- Vector spaces and Affine space operations +- Analytic functions, Polynomials, and Bivariant functions +- Sampling of Special Matrices + +## Planned Features + +- Statistics: Hypothesis testing +- Algebra: Group and Ring operations +- Auto-registration for custom fields and dimensions + +## Supported Matrix Types + +- General Matrix: `CategoryOf.OnField.FMatrix` +- Normal Matrix: `CategoryOf.OnField.FNormalMatrix` +- Diagonal Matrix: `CategoryOf.OnField.FDiagonalMatrix` +- Unitary Matrix: `CategoryOf.OnField.FDiagonalMatrix` +- Special Unitary Matrix: `CategoryOf.OnField.FSpecialUnitaryMatrix` + +**Note**: The types `CategoryOf<>.OnField<>.FLieUnitaryMatrix` and `CategoryOf<>.OnField<>.FSpecialLieUnitaryMatrix` may not represent matrices as their names imply. Instead, they denote congruence classes of \( \{ \log(x) \ | \ x \in SU \} \), where all eigenvalues lie within \((-π, π)\). +Be cautious when using `FSpecialUnitaryMatrix.Log`, as this may not behave as the general logarithm function. + +## Requirements + +- .NET SDK version: 8.0.0 + +## Installation + +Clone the repository: +```bash +git clone +cd Skeleton +dotnet restore +dotnet build +``` +Alternatively, add the NuGet source: + +```bash +dotnet nuget add source --name hangman-lab https://git.hangman-lab.top/api/packages/hzhang/nuget/index.json +``` + + +## Usage +### Example Usage +You can use tensors (vectors and matrices) with predefined dimensions (e.g., 2, 3, 4) and predefined fields (e.g., double, complex): + +```csharp + +using Skeleton.Algebra.DimensionProviders; +using Skeleton.Algebra; +using System.Numerics; + +var c2_1 = new CategoryOf.OnField.FVector(1, 1); +var c2_2 = c2_1 * 0.5d; +var c2_3 = c2_1 + c2_2; + +var m3_r = new CategoryOf.OnField.FMatrix( +1d, 0d, 0d, +0d, 1d, 0d, +0d, 0d, 1d +); +``` +### Simplifying with Aliases +Declare aliases in a Usings.cs file: + +```csharp +global using C2 = Skeleton.Algebra.CategoryOf.OnField.FVector; +global using C3 = Skeleton.Algebra.CategoryOf.OnField.FVector; +global using C4 = Skeleton.Algebra.CategoryOf.OnField.FVector; + +global using R2 = Skeleton.Algebra.CategoryOf.OnField.FVector; +global using R3 = Skeleton.Algebra.CategoryOf.OnField.FVector; +global using R4 = Skeleton.Algebra.CategoryOf.OnField.FVector; + +global using SU2 = Skeleton.Algebra.CategoryOf.FSpecialUnitaryMatrix; +global using SU3 = Skeleton.Algebra.CategoryOf.FSpecialUnitaryMatrix; +global using SU4 = Skeleton.Algebra.CategoryOf.FSpecialUnitaryMatrix; + +``` +Then use the aliases in your code: +```csharp +C2 a = new C2(1, 0); +C2 b = a * 0.5d; + +``` +### Custom Dimension and Field +#### Custom Dimension +To define a custom dimension, declare an interface like this: +```csharp +using Skeleton.Algebra.DimensionProviders; +[OfDimension(10)] +public interface IDimX +{ + +} +``` +#### Custom Field +To use a custom field, implement a FieldStructure class with the following required methods: +```csharp +class CustomFieldStructure : FieldStructure +{ + abstract TScalar Addition(TScalar self, TScalar other); + abstract TScalar AdditionUnit { get; } + abstract TScalar Multiplication(TScalar self, TScalar other); + abstract TScalar MultiplicationUnit { get; } + abstract TScalar AdditionInverse(TScalar self); + abstract TScalar MultiplicationInverse(TScalar self); + abstract TScalar Conj(TScalar self); + abstract bool IsEqualApprox(TScalar self, TScalar other, double? absTol=null, double? relTol = null); + abstract string RawCSharpRepresentation(TScalar x); + abstract double MaxError(TScalar a); + abstract TScalar SquareRoot(TScalar a); + +} +``` +Additionally, you can optionally implement the following methods for extended functionality: +```csharp +virtual TScalar Log(TScalar x); +virtual TScalar Exp(TScalar x); +virtual TScalar FromComplex(Complex a); +virtual TScalar RealMul(TScalar a, double b); +virtual Complex ComplexCast(TScalar a); +virtual TScalar Resolve(string dumpString); +virtual string DumpString(TScalar x); +virtual string RawPythonRepresentation(TScalar x); +virtual string RawRepresentation(TScalar x); +virtual TScalar FromReal(double x); +virtual double AsReal(TScalar x); +virtual TScalar Fix(TScalar x); +virtual TScalar Division(TScalar self, TScalar other); +virtual TScalar Subtraction(TScalar self, TScalar other); + +``` + +Finally, register the custom field: +```csharp +ScalarFieldStructureProvider.Register(new CustomFieldStructure()); +``` +## License +[MIT][license] © [hzhang][author] + + +[author]: https://hangman-lab.top +[license]: license \ No newline at end of file diff --git a/Skeleton.csproj b/Skeleton.csproj index 5788700..7782305 100644 --- a/Skeleton.csproj +++ b/Skeleton.csproj @@ -4,10 +4,13 @@ net8.0 enable disable - 0.0.5 + 0.0.6 hzhang true + hzhang + https://git.hangman-lab.top/hzhang/Skeleton + https://git.hangman-lab.top/hzhang/Skeleton diff --git a/license b/license new file mode 100644 index 0000000..d78261e --- /dev/null +++ b/license @@ -0,0 +1,22 @@ +(The MIT License) + +Copyright (c) hzhang + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/src/Algebra.zip b/src/Algebra.zip deleted file mode 100644 index 7eb08180b60d2e8c8078c14b2f5849ae92831d86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46133 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≻Me_uzjf~3voU||v%E)7@4kzx2Q&a6$l=>G@gIMx)z;)z z7*M*V|6gg>9tdUD#?=}Pxx}K(S4m-W?IK~_8YQc-MhJyU>4u`orBd`poadbPob!909iAh_}qC>TfCZnGOSe^Xm6?tT&7uF{^oh55&M zx%$+KgGQ9!uAX}6Nk~c{Kj)G9bv*xFNrxJJe@9}?fIKFaiq|3HN8p-3g*wA+|=3mR{X$g}0*qB3E7N%`xl<~lW z)+#F9@Im9~DWdsFrv)Vh1MM2gy?^|j{gX|?gI`~t418EF(Mq)0+%&Md-1JoXP}rTu z_f!WtIqx{NM|0Wr^vDTGCYtNAH}^emHZ49Bed77^rE5&(lm2|`R@)bFs=I6dU6&^+ z(gvNboWf{v|YSpWk8k!^Kt9G#uiF&@GR$9y~bsyi&vXxJ+3vS$)7nRLaFH;tS&I$ zX5rQt>TUD>pG+dF@>EChoXASEsNP$*e7zM5oi^m>_tQS6rD|E0JWf2zD!HOgJCWqr zwx?ltRsYuTki-C$bE%7)+a^1v%+uSdSoXlpA^zlMYGcN@?Tcf#&bwe--xIsMh~Cht zVbPy?JF=kY{^=Hro$ekjnxYRHQ;q(t|9lumnPfmJ;p|aCaPSWsM@~Ub{jomtzn*~c zj~uW$0+GXqQ}e?4cVED%dFf27vTO48DrpSKA)b{a7D-#SrbSQpbfr9~rTG7sG!jARf6v8d9w)X8K%;yy)IG!#2cFSM?tA-Oqoo zjZrv6zmX$mdDt+QA<_Mpm}OJr@@I;qeQy4Gx}C4^1r>1}6Hm6xNUsSr3{twkfH2w2 zq-W4qyn^Zy8S0@FqH`@Z%<9nUkCs<9Z5%L|*;eN#J4?Cwoao9twRmagPn|j)p_y9w z(z$(G^DI=RFbbLnCC^zimK~~Gy3nFnM1&UOmp7fMTCq=Qec?*Ehm5xQa&Nzbl#o`d~n4Ni5fUCU(G zS(-eH=w9I)bg`@=J=W;hWJYQBdaAzlg>hxcAATo+6ImvK!3sNAzc$!vuedibN%vm)(_DWa z1NZr&jZ>Kh|F{P#&`MJ3AL?+Pw+|`IAbe8R4=#S_Lo!)^Y{;0=HdVKU<)xU;Fqpif z>rR*B$3(R))mYkfh#%|gbP1cadm5JTvca--8|8-&DjRk8`f%{_jNoq|J zyZ2~NT6>PH^C6|5eQIV_btE58RE?P4+}&-u#X(BaY;CH=HCfy~DC5Z|c7#a#qAq{c zM+4U)m*=E?Oi);T^1tQAM45Fn)mEoa6I#^8r#{UKKG9famTn%$s8*hnp6}qAV%#hJ zQcvT6Plt4Qp6kva7xUnvS`Ed+c1EQn1-qJthx-R!tocYSZfN^$hKP@=_0cNHC;J~P zR+FH(yiXL@i41&YPuC7_k~*KhV*eX^<(#;DlSth8h*l zkhwWiWztk~jzP6YhmGsRn)n;GcH!@XIy=X8#B}whl*B4HZuVl{jFw5-e7@yLt=@F; zcZ3Pz{j=?o51fd26fswPzhV4JFGl|Oj=rIVN&hQzGO*Gx)KfhDs8n=)Q>f>h9M|PD z32Vmf@TQooSlz1~Yq_pso|AL8U!Q9HUeA@gpPAp;A|L@JZoK?Y^5BT;UuRxKPA5TOlfiFfpG_Oq z(L4k=>>6$rWhjF-WVl*ginMA)^9}I(N}3oovFc0Xu=>dsZ2fVJV-ChS-UgITC^&Zb z-;IC9KnD;w72>l_K)(PGV1dKTSmQ2EbIUkBQ|1EM#rY5P%U26v34AWFQOMR13~0{l zu1N?On|z-WSrF_Cp<8%=y)0gZ2XTu3Ue*^8Q9@eBF%=Fek+=0PD5%E(V_5)?S@+HH zyvR|vSWZNQ#0B$-Q<9Vy<|{oN;t1$0^coa6PZq&plT|p#5a;s^g zZH6De=D*y8Kr_G{+){16+#A^EV1RwbK^|xV3`Qt8raG688G=8K2Z2C?yrsz6Vz3Pf@5jc0x0ku^#XY{ zK#LfHs-RGC%!4X`2H#mDlvfM1?inbU2nEM(+Y7G654ZyW^3HUi%o-FnS=kv;FO6Tsv$A~T$OZbJ){f%`!yIOfZ@eIbglp*{tsptZlyc?`$axbQPYxcXh^;@Rk~1fct1!$ z{udNBdFI+-bC605g7Ad74MNL6fUE>4I2JGx1cC=AR{_>h_;rHTN&qQ_P;hL=h7oKM zvepFZMc$R0+l!SOhY^vaM&Un%(TqxNFUoBi0Rq88y*L6RAKC<$NHk}V+l$+LM*tKu zZ4*TVp@k;Gpw%;(KP??Dk0t^A(=tZ|*Y%+s348fBM_j#%Xn}`wX>TwTvG;IoG z*g?UuHzR`xn{Nj#1KkBIL(`2wMivwtTM#g!Wj~mo1$6*eyxv8(1#I&6z+oM}rHQ~J zlCQxa#A1df4{-;>tK!r(CsL{PswYXW0@34X`o0-wghnHOc+0rDXf&H-T57*Ik|5uuR~8ND+H zOg<<$W*a>QGXI-Cu)vML>*K{nFCMwiCx+-_V1L&gJug0bF#@hPq2QQ)@)-Evd)djW t0($TdZeXC`m;z%A75EK2_^|;)Zj}2NI|@Mzpe^M5Y?>k>Qknw(`aht%3d;Zh