private async Task <string> TutorResult(string Method, string RawMatrix) { MathMLBuilder MathBuilder = default; var engine = new MapleLinearAlgebra(DefaultPath); if (RawMatrix.EndsWith(";")) { RawMatrix = RawMatrix.Remove(RawMatrix.Length - 1, 1).Replace("\r\n", string.Empty); } engine.Open(); var minified = await engine.LPrint(RawMatrix); minified = minified.Replace("\r\n", ""); MapleMatrix matrix = default; try { matrix = new MapleMatrix(minified); } catch (ArgumentException) { MessageBox.Show("Matrix kunne ikke fortolkes. Vær sikker på du har kopieret fra maple"); engine.Close(); return(default);
private async static Task <JavaMapletGaussOutput> MatrixTutorResult(MapleLinearAlgebra engine, MapleMatrix matrix, string methodName) { await semaphore.WaitAsync();//Since same protocol is used for every Tutor we have to wait for other tutor's to be closed before we can recall. try { var engineType = typeof(MapleLinearAlgebra); var method = engineType.GetMethod(methodName); //reflection used since each Tutor uses same protocol, for linearalgebra, (but different call methods to maple) IWindow window = await(Task <IWindow>) method.Invoke(engine, new object[] { matrix }); // await engine.GaussJordanEliminationTutor(matrix); if (window is MSWindow) // Microsoft Windows { // Find Loopback Pseudo interface for sniffing. var nic = NetworkInterfaceInfo .GetInterfaces() .FirstOrDefault(c => c.Name.Contains("Loopback Pseudo")); // Ensure loopback pseudo interface is found before we start trying to sniff. if (nic != default(NetworkInterfaceInfo)) { PcapNgFileOutput output; SocketSniffer sniffer; StartSniffing(nic, out output, out sniffer); await InteractWithDefaultTutor((MSWindow)window, sniffer); StopSniffing(output, sniffer); return(InterpretMatrixSniffedData()); } } } finally { semaphore.Release(); } return(null); }
public async static Task <JavaMapletGaussOutput> InverseTutor(MapleLinearAlgebra engine, MapleMatrix matrix) { return(await MatrixTutorResult(engine, matrix, nameof(engine.InverseTutor))); }
public async static Task <JavaMapletGaussOutput> GaussJordanEliminationTutor(MapleLinearAlgebra engine, MapleMatrix matrix) { return(await MatrixTutorResult(engine, matrix, nameof(engine.GaussJordanEliminationTutor))); }
private async static Task <JavaMapletGaussOutput> TutorResult(MapleLinearAlgebra engine, MapleMatrix matrix, string methodName) { List <string> operations = new List <string>(); var gaussOutput = new JavaMapletGaussOutput(); await semaphoreSlim.WaitAsync();//Since same protocol is used for every Tutor we have to wait for other tutor's to be closed before we can recall. try { var engineType = typeof(MapleLinearAlgebra); var method = engineType.GetMethod(methodName); //reflection used since each Tutor uses same protocol, for linearalgebra, (but different call methods to maple) IWindow window = await(Task <IWindow>) method.Invoke(engine, new object[] { matrix }); // await engine.GaussJordanEliminationTutor(matrix); if (window is MSWindow) // Microsoft Windows { // Find interfaces for sniffing. var nics = NetworkInterfaceInfo.GetInterfaces(); var nic = nics.FirstOrDefault(c => c.Name.Contains("Loopback Pseudo")); // Ensure loopback pseudo interface is found... if (nic != default(NetworkInterfaceInfo)) { #region Start Sniffing var appOptions = new AppOptions(); appOptions.Parse(new string[] { "" }); var filters = appOptions.BuildFilters(); var output = new PcapNgFileOutput(nic, appOptions.Filename); var sniffer = new SocketSniffer(nic, filters, output); sniffer.Start(); #endregion #region MSWIN var mswin = (MSWindow)window; mswin.WindowPos(0, 0, 400, 800); for (int i = 0; i < 4; i++) { mswin.SendKeyStroke(System.Windows.Forms.Keys.Tab); await Task.Delay(60); } mswin.SendKeyStroke(System.Windows.Forms.Keys.Enter); mswin.Hide(); long LastPackageCount = 0; int WaitTries = 0; while (true) // wait for program to stop sending packages to intercept. { await Task.Delay(400); LastPackageCount = sniffer.PacketsCaptured; if (LastPackageCount > 0 && LastPackageCount == sniffer.PacketsCaptured) { WaitTries++; } if (WaitTries > 4) { break; } } mswin.Close(); #endregion #region Interpret Sniffed Data sniffer.Stop(); output.Dispose(); using (var reader = new StreamReader("snifter.pcapng")) { var content = reader.ReadToEnd(); var regex = new Regex(@"\<application_communications.*?\<content\>Applied operation\:\ (.*?)\<\/content\>", RegexOptions.Singleline); var match = regex.Match(content); while (match.Success) { var operation = match.Groups[1].Value.Trim();//initial space operations.Add(operation); match = match.NextMatch(); } var mapleMatrixRegex = new Regex(@"\<content\>(\<\;.*?)\<", RegexOptions.Singleline); var mapleMatrixMatch = mapleMatrixRegex.Match(content); var lastMatchStr = ""; while (mapleMatrixMatch.Success) { lastMatchStr = mapleMatrixMatch.Groups[1].Value; mapleMatrixMatch = mapleMatrixMatch.NextMatch(); } StringBuilder builder = new StringBuilder(lastMatchStr); gaussOutput.Operations = operations.ToArray(); int ra_index = 0; int index = 0; var search = "mtext>&NewLine;"; while ((ra_index = builder.ToString().IndexOf(search, ra_index)) != -1) { ra_index += search.Length; if (index >= operations.Count) { break; } builder.Insert(ra_index, $" {gaussOutput.OperationsDa[index++]} &NewLine;&NewLine;&NewLine;"); } gaussOutput.MathML = HttpUtility.HtmlDecode(builder.ToString()); } #endregion } } } finally { semaphoreSlim.Release(); } return(gaussOutput); }
public MainWindow() { InitializeComponent(); UpdateMaplePath(); //mathBrowser.Navigate(new Uri(@"file:///C:/Users/Rsoeb/source/repos/BasisMat2/BasisMat2/bin/Debug/MathML/Index.html")); #region Test (Kan blive slettet NP) MathMLBuilder MathBuilder = default; btnTest.Click += (s, e) => { var engine = new MapleLinearAlgebra(Settings.Default.Path); /* * var matrix = new MapleMatrix(new string[][] * { * new string[] { "a", "2", "3" }, * new string[] { "1", "-4", "-19" }, * new string[] { "-1", "3", "14" } * }); */ btnCopy.IsEnabled = false; btnTest.IsEnabled = false; btnTest.Content = "Udregner..."; var gaussMatrixRaw = txtGaussMatrix.Text.Trim(); if (gaussMatrixRaw.EndsWith(";")) { gaussMatrixRaw = gaussMatrixRaw.Remove(gaussMatrixRaw.Length - 1, 1); } Task.Run(async() => { engine.Open(); var minified = await engine.LPrint(gaussMatrixRaw); minified = minified.Replace("\r\n", ""); MapleMatrix matrix = default; try { matrix = new MapleMatrix(minified); } catch (ArgumentException) { MessageBox.Show("Matrix kunne ikke fortolkes. Vær sikker på du har kopieret fra maple"); rtOutput.Dispatcher.Invoke(() => { btnTest.Content = "Udregn Matrix"; btnTest.IsEnabled = true; }); engine.Close(); return; } var TutorResult = await JavaWin.JavaMapletInteractor.GaussJordanEliminationTutor(engine, matrix); engine.Close(); MathBuilder = new MathMLBuilder(TutorResult.MathML); MathBuilder.AddText("\nOpskriver Ligninger:\n"); var MapleML = new MapleMathML(Settings.Default.Path); MapleML.Open(); var ML_Test = await MapleML.Export("Matrix(3, 3, [[-2, 5, -7], [3, -4, 7], [3, -5, 8]])^2 = (Matrix(3, 3, [[-2, 5, -7], [3, -4, 7], [3, -5, 8]])) . (Matrix(3, 3, [[-2, 5, -7], [3, -4, 7], [3, -5, 8]]))"); MathBuilder.MergeML(ML_Test); var ML_Console = await MapleML.Import(MathBuilder.ToString()); rtOutput.Dispatcher.Invoke(() => { rtOutput.Document.Blocks.Clear(); //rtOutput.AppendText(string.Join("\n", TutorResult.OperationsDa)); rtOutput.AppendText(ML_Console); btnTest.Content = "Udregn Matrix"; btnTest.IsEnabled = true; }); MapleML.Close(); }); }; #endregion btnCopy.Click += (s, e) => { Clipboard.SetText(MathBuilder.ToString()); btnCopy.IsEnabled = false; btnCopy.Content = "Kopieret"; Task.Run(async() => { await Task.Delay(3000); btnCopy.Dispatcher.Invoke(() => { btnCopy.IsEnabled = true; btnCopy.Content = "Kopier (Maple)"; }); }); }; }