using System; using System.Collections.Generic; using System.IO; using System.Runtime.Serialization.Formatters.Binary; using System.Threading; using System.Linq; using miew.BitArray; using miew.Concurrency; #pragma warning disable 0162 namespace agree { public partial struct FeatureInfo { public FeatureInfo(BinaryReader br, Type[] type_arr) { this.i_feat = br.ReadInt32(); this.feature = br.ReadString(); this.maximal_type = type_arr[br.ReadUInt16()]; this.c_failures = 0; } public void Write(BinaryWriter bw) { bw.Write(i_feat); bw.Write(feature); bw.Write(maximal_type.m_id); } }; /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// /// /// /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// public unsafe partial class TypeMgr { /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// /// /// /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// public void Save(CommandToken tx, BinaryWriter bw) { // write types bw.Write(code_size); bw.Write(c_types); for (int i = 0; i < c_types; i++) type_arr[i].Write(bw, i); // write features bw.Write(feat_arr.Length); for (int i = 0; i < feat_arr.Length; i++) feat_arr[i].Write(bw); // write strings strings.Write(bw); //// write trays //Tray[] rgtr = TrayMgr.GetTypeMgrTrays(this).ToArray(); //bw.Write(rgtr.Length); //foreach (Tray _tr in rgtr) // _tr.Write(bw); // write expanded TFSs for types for (int i = 0; i < c_types; i++) type_arr[i].WriteTfss(bw); // write entries bw.Write(entry_dict.Count); foreach (Entry ent in entry_dict.Values) ent.Write(bw); } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// /// /// /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// public void LoadBinary(CommandToken tx, BinaryReader br) { // read types code_size = br.ReadInt32(); c_types = br.ReadInt32(); type_arr = new Type[c_types]; int[][] tdp = new int[c_types][]; int[][] tdc = new int[c_types][]; code_dict = new Dictionary<BitArr, Type>(); for (int i = 0; i < c_types; i++) { Type t = new Type(this, br, out tdp[i], out tdc[i]); type_dict[t.Name] = t; type_arr[i] = t; code_dict.Add(t.m_code, t); } for (int i = 0; i < c_types; i++) { Type t = type_arr[i]; int[] td; td = tdp[i]; if (td != null) foreach (int type_id in td) t.AddIParent(type_arr[type_id]); td = tdc[i]; if (td != null) foreach (int type_id in td) t.AddIChild(type_arr[type_id]); } tdp = tdc = null; // read features int c_feat = br.ReadInt32(); feat_arr = new FeatureInfo[c_feat]; for (int i = 0; i < c_feat; i++) { FeatureInfo fi = new FeatureInfo(br, type_arr); feat_arr[i] = fi; feat_map.Add(fi.feature, fi); } // read strings strings.Read(br); // load trays //Dictionary<int, Tray> tray_map = new Dictionary<int, Tray>(); //int c_tr = br.ReadInt32(); //for (int i = 0; i < c_tr; i++) //{ // var kvp = Tray.Load(this, br); // tray_map.Add(kvp.Value, kvp.Key); //} // read def/expand for types. They need to map tray indexes hence the delay in doing this. for (int i = 0; i < c_types; i++) type_arr[i].ReadTfss(br); // read entries int c_ent = br.ReadInt32(); for (int i = 0; i < c_ent; i++) { Entry e = Entry.Read(br, this); entry_dict.Add(e.Name, e); } /// Resolve special types: attach special configuration types used in lists, etc. ResolveSpecialTypes(); /// Resolve start symbols and some special rule types ResolveSpecialEntries(); } }; /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// /// /// /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// public partial class Strings { public void Write(BinaryWriter bw) { bw.Write(dict.Count); foreach (var kvp in dict.Enumerate()) { bw.Write(kvp.Key); bw.Write(kvp.Value); } } public void Read(BinaryReader br) { next_string_id = br.ReadInt32(); for (int i = 0; i < next_string_id; i++) dict.Add(br.ReadString(), br.ReadInt32()); } }; /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// /// /// /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// public abstract partial class Instance : ISysObj { protected static BinaryFormatter bf = new BinaryFormatter(); public Instance(TypeMgr tm, BinaryReader br) { this.tm = tm; this.m_flags = (Flags)br.ReadInt32(); this.Name = br.ReadString(); } public virtual void Write(BinaryWriter bw) { bw.Write((Int32)m_flags); bw.Write(Name); } }; /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// /// /// /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// public abstract partial class Entry : Instance { protected Entry(Type t, BinaryReader br) : base(t.tm, br) { this.t = t; this._definition = Tfs.Read(br); } public static Entry Read(BinaryReader br, TypeMgr tm) { String s_type = br.ReadString(); int typeid = br.ReadInt32(); Type t = tm.type_arr[typeid]; Entry e; switch (s_type) { case "GrammarRule": e = new GrammarRule(t, br); break; case "MorphologicalRule": e = new MorphologicalRule(t, br); break; case "LexicalRule": e = new LexicalRule(t, br); break; case "StartSymbol": e = new StartSymbol(t, br); break; case "NodeLabelTemplate": e = new NodeLabelTemplate(t, br); break; case "NodeMetaTemplate": e = new NodeMetaTemplate(t, br); break; case "LexicalEntry": e = new LexicalEntry(t, br); break; default: throw new Exception("unrecognized entry type: '" + s_type + "'"); } return e; } public override void Write(BinaryWriter bw) { // read by static function String s_type = this.GetType().Name; bw.Write(s_type); bw.Write(t.m_id); // read by base class constructor base.Write(bw); // read by this class constructor _definition.Write(bw); } }; /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// <summary> /// /// </summary> /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// public abstract partial class StaticExpandEntry : Entry { public StaticExpandEntry(Type t, BinaryReader br) : base(t, br) { //if ((m_flags & Flags.Expanded) > 0) // _expanded = Tfs.Read(br); } public override void Write(BinaryWriter bw) { //if ((m_flags & Flags.Expanded) > 0) // _expanded.Write(bw); //base.Write(bw); } }; /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// /// /// /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// public abstract partial class DemandExpandEntry : Entry { public DemandExpandEntry(Type t, BinaryReader br) : base(t, br) { } }; /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// /// /// /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// public partial class LexicalEntry : DemandExpandEntry { public LexicalEntry(Type t, BinaryReader br) : base(t, br) { words = new String[br.ReadInt32()]; for (int i = 0; i < words.Length; i++) words[i] = br.ReadString(); } public override void Write(BinaryWriter bw) { base.Write(bw); bw.Write(words.Length); foreach (String s in words) bw.Write(s); } }; /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// /// /// /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// public partial class LexicalRule : Rule { public LexicalRule(Type t, BinaryReader br) : base(t, br) { } public override void Write(BinaryWriter bw) { base.Write(bw); } } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// /// /// /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// public partial class MorphologicalRule : LexicalRule { public MorphologicalRule(Type t, BinaryReader br) : base(t, br) { morph_subrules = (MorphologySubrule[])bf.Deserialize(br.BaseStream); if (morph_subrules.Length == 0) throw new Exception("a morphological rule with no subrules should be a lexical rule"); } public override void Write(BinaryWriter bw) { base.Write(bw); MorphologySubrule[] ms = morph_subrules ?? new MorphologySubrule[0]; bf.Serialize(bw.BaseStream, ms); } } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// /// /// /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// public abstract partial class GlbDag : Instance { public GlbDag(TypeMgr tm, BinaryReader br) : base(tm, br) { m_id = br.ReadUInt16(); m_level = br.ReadUInt16(); m_code = new BitArr(tm.code_size, br); } public override void Write(BinaryWriter bw) { base.Write(bw); bw.Write(m_id); bw.Write(m_level); m_code.Write(bw); } }; /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// /// /// /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// public partial class Type : GlbDag { public Type(TypeMgr tm, BinaryReader br, out int[] parent_ids, out int[] child_ids) : base(tm, br) { int c; c = br.ReadInt32(); if (c == 0) parent_ids = null; else { parent_ids = new int[c]; for (int i = 0; i < c; i++) parent_ids[i] = br.ReadUInt16(); } c = br.ReadInt32(); if (c == 0) child_ids = null; else { child_ids = new int[c]; for (int i = 0; i < c; i++) child_ids[i] = br.ReadUInt16(); } c = br.ReadInt32(); if (c == 0) fc = FeatureConfig.Empty; else { var tmp = new int[c]; for (int i = 0; i < c; i++) tmp[i] = br.ReadInt32(); throw new NotImplementedException(); //fc = tm.fcm.Get(tmp); } } public void Write(BinaryWriter bw, int id) { if (id != m_id) throw new Exception(); base.Write(bw); bw.Write(i_parents.Count); foreach (Type t in i_parents) bw.Write(t.m_id); bw.Write(i_children.Count); foreach (Type t in i_children) bw.Write(t.m_id); bw.Write(fc.Count); foreach (int i_feat in fc.rg_fix) bw.Write(i_feat); } public void WriteTfss(BinaryWriter bw) { //if ((m_flags & Type.Flags.LoadedDefinition) > 0) // Definition.Write(bw); //if ((m_flags & Type.Flags.Expanded) > 0) // Expanded.Write(bw); } public void ReadTfss(BinaryReader br) { //if ((m_flags & Type.Flags.LoadedDefinition) > 0) // _definition = Tfs.Read(br); //if ((m_flags & Type.Flags.Expanded) > 0) // _set_expanded(Tfs.Read(br)); } }; public partial class Tfs : ISysObj { public void Write(BinaryWriter bw) { // bw.Write(this.id); // bw.Write((UInt64)Edge); } public static Tfs Read(BinaryReader br) { int ttid = br.ReadInt32(); int tfs_id = ttid & unchecked((int)0xFFFFFFC0); int tix = ttid & 0x1F; //Tray tr = tray_map[tix]; //return new SharedPoolTfs(tr.tm, tfs_id | tr.tix, (Edge)br.ReadUInt64()); return null; } }; }