public static List <Op <T> > Load <T>(string name, bool includeCost) where T : struct, IEquatable <T>, IFormattable
        {
            List <Op <T> > result;

            using (var sr = new StreamReader(File.Open($"{name}.graphml", FileMode.Open)))
            {
                var graphml = sr.ReadToEnd();
                result = FromXml <T>(graphml, includeCost);
            }

            using (var sr = new StreamReader(File.Open($"{name}.json", FileMode.Open)))
            {
                var json = sr.ReadToEnd();
                var data = JsonConvert.DeserializeObject <Dictionary <string, Dictionary <string, object> > >(json);

                // Find all PlaceHolders and update their current value
                var visitor = new OpVisitor <T>(op =>
                {
                    var variable = op as IPersistable <T>;
                    if (variable != null)
                    {
                        Dictionary <string, object> d;
                        if (data.TryGetValue(variable.Name, out d))
                        {
                            variable.Result = BuildVolume <T>(d);
                        }
                    }
                });

                result[0].Accept(visitor);
            }

            return(result);
        }
        public static Dictionary <string, object> GetVolumes <T>(this Op <T> op) where T : struct, IEquatable <T>, IFormattable
        {
            var result = new Dictionary <string, object>();

            // Retrieve all ops and assign an Id
            var visitor = new OpVisitor <T>(o =>
            {
                var persistable = o as IPersistable <T>;
                var volume      = persistable?.Result;
                if (volume != null)
                {
                    var dico = new Dictionary <string, object>
                    {
                        ["dim0"] = volume.Shape.GetDimension(0),
                        ["dim1"] = volume.Shape.GetDimension(1),
                        ["dim2"] = volume.Shape.GetDimension(2),
                        ["dim3"] = volume.Shape.GetDimension(3),
                        ["vol"]  = volume.ToArray(),
                    };

                    result.Add(persistable.Name, dico); // we use Add here to it throws when the name is already used
                }
            });

            op.Accept(visitor);

            return(result);
        }
Beispiel #3
0
        public Volume <T> Run(Op <T> fun, Dictionary <string, Volume <T> > dictionary)
        {
            this.BatchSize = dictionary.Values.Select(o => o.Shape.GetDimension(3)).Max(); // is this correct?

            // Find all PlaceHolders and update their current value
            var visitor = new OpVisitor <T>(op =>
            {
                var placeHolder = op as PlaceHolder <T>;
                if (placeHolder != null)
                {
                    placeHolder.Result = dictionary[placeHolder.Name];
                    placeHolder.SetDirty();
                }

                var variable = op as Variable <T>;
                if (variable != null)
                {
                    this.LearnableVariables[variable.Name] = variable;
                }
            });

            fun.Accept(visitor);

            var result = fun.Evaluate(this);

            this.Step++;

            return(result);
        }
Beispiel #4
0
        public void Dump(Op <T> fun, string fileName)
        {
            using var sw = new StreamWriter(File.Create(fileName));

            var streamWriter = sw;
            var visitor      = new OpVisitor <T>(op =>
            {
                streamWriter.WriteLine(op);
                streamWriter.WriteLine(op.Result == null ? "[Null]" : op.Result.ToString());
            });

            fun.Accept(visitor);
        }
Beispiel #5
0
        /// <summary>
        ///     Automatic differentiation using reverse accumulation
        /// </summary>
        /// <param name="cost"></param>
        /// <param name="gradient">1 will be used as gradient if not specify</param>
        public void Differentiate(Op <T> cost, Op <T> gradient = null)
        {
            if (!this._derivativeComputed)
            {
                var visitor = new OpVisitor <T>(op => { op.Derivate = null; });
                cost.Accept(visitor);

                this.Cost = cost;

                cost.Derivate = gradient ?? ConvNetSharp <T> .One;

                var differentiateVisitor = new DifferentiateVisitor <T>();
                cost.Accept(differentiateVisitor);

                this._derivativeComputed = true;
            }
        }
Beispiel #6
0
        public void UpdatePlaceHolder(Op <T> fun, Dictionary <string, Volume <T> > dictionary)
        {
            // Find all PlaceHolders and update their current value
            var visitor = new OpVisitor <T>(op =>
            {
                if (op is PlaceHolder <T> placeHolder)
                {
                    placeHolder.SetValue(dictionary[placeHolder.Name]);
                }

                if (op is Variable <T> variable && variable.IsLearnable)
                {
                    this.LearnableVariables[variable.Name] = variable;
                }
            });

            fun.Accept(visitor);
        }
        public ViewModel(Op <T> root)
        {
            var colors = CreateColorPalette(20);

            var set = new HashSet <Op <T> >();

            var visitor = new OpVisitor <T>(op =>
            {
                if (!set.Contains(op))
                {
                    set.Add(op);
                }
            });

            root.Accept(visitor);

            var graph = new BidirectionalGraph <object, IEdge <object> >(); // new OpGraph();

            var dico = new Dictionary <Op <T>, OpVertex>();

            foreach (var op in set)
            {
                var colIndex = op.GetType().GetHashCode() % colors.Count;
                var opVertex = new OpVertex
                {
                    Name  = op.Representation,
                    Color = colors[colIndex],
                    Shape = op.Result?.Shape.ToString() != null ? "[" + op.Result.Shape + "]" : string.Empty
                };
                dico[op] = opVertex;
                graph.AddVertex(opVertex);
            }

            foreach (var op in set)
            {
                foreach (var parent in op.Parents)
                {
                    graph.AddEdge(new OpEdge(dico[parent], dico[op]));
                }
            }

            this.Graph = graph;
        }
Beispiel #8
0
        public Op <T> GetVariableByName(Op <T> fun, string name)
        {
            Op <T> result = null;

            var visitor = new OpVisitor <T>(op =>
            {
                if (op is INamedOp <T> variable)
                {
                    if (variable.Name == name)
                    {
                        result = op;
                    }
                }
            });

            fun.Accept(visitor);

            return(result);
        }
Beispiel #9
0
        public void UpdatePlaceHolder(Op <T> fun, Dictionary <string, Volume <T> > dictionary)
        {
            // Find all PlaceHolders and update their current value
            var visitor = new OpVisitor <T>(op =>
            {
                var placeHolder = op as PlaceHolder <T>;
                if (placeHolder != null)
                {
                    placeHolder.Result = dictionary[placeHolder.Name];
                    placeHolder.SetDirty();
                }

                var variable = op as Variable <T>;
                if (variable != null)
                {
                    this.LearnableVariables[variable.Name] = variable;
                }
            });

            fun.Accept(visitor);
        }
        /// <summary>
        ///     Serialize graph to graphml
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="op">Root op</param>
        /// <param name="costOp">Optional cost Op</param>
        /// <returns></returns>
        public static string ToXml <T>(this Op <T> op, Op <T> costOp = null) where T : struct, IEquatable <T>, IFormattable
        {
            var id   = 0;
            var set  = new Dictionary <Op <T>, string>();
            var keys = new Dictionary <string, KeyDescription>
            {
                { "d0", new KeyDescription {
                      Id = "d0", Name = "type"
                  } },
                { "d1", new KeyDescription {
                      Id = "d1", Name = "root", @for = "graph"
                  } },
                { "d2", new KeyDescription {
                      Id = "d2", Name = "cost", @for = "graph"
                  } }
            };

            // Retrieve all ops and assign an Id
            var visitor = new OpVisitor <T>(o =>
            {
                if (!set.ContainsKey(o))
                {
                    set.Add(o, "n" + id++);
                }
            });

            op.Accept(visitor);
            costOp?.Accept(visitor);

            using (var sw = new StringWriter())
            {
                using (var writer = XmlWriter.Create(sw, new XmlWriterSettings {
                    NewLineOnAttributes = true, Indent = true
                }))
                {
                    var ns = "http://graphml.graphdrawing.org/xmlns";

                    writer.WriteStartDocument();
                    writer.WriteStartElement("graphml", ns);
                    writer.WriteAttributeString("xmlns", ns);

                    // Get all keys
                    var keyId = 3;
                    foreach (var pair in set)
                    {
                        var data = pair.Key.GetData();
                        if (data.Any())
                        {
                            foreach (var o in data)
                            {
                                var name = pair.Key.GetType().Name + "." + o.Key;
                                if (!keys.ContainsKey(name))
                                {
                                    keys[name] = new KeyDescription {
                                        Id = "d" + keyId++, Name = name
                                    };
                                }
                            }
                        }
                    }

                    // Generate key xml
                    foreach (var keyDescription in keys.Values)
                    {
                        writer.WriteStartElement("key");
                        writer.WriteAttributeString("id", keyDescription.Id);
                        writer.WriteAttributeString("for", "node");
                        writer.WriteAttributeString("attr.name", keyDescription.Name);
                        writer.WriteAttributeString("attr.type", "string");
                        writer.WriteEndElement();
                    }

                    writer.WriteStartElement("graph");
                    writer.WriteAttributeString("id", "G");
                    writer.WriteAttributeString("edgedefault", "directed");

                    // Root
                    writer.WriteStartElement("data");
                    writer.WriteAttributeString("key", "d1");
                    writer.WriteString(set[op]);
                    writer.WriteEndElement();

                    // Cost if provided
                    if (costOp != null)
                    {
                        writer.WriteStartElement("data");
                        writer.WriteAttributeString("key", "d2");
                        writer.WriteString(set[costOp]);
                        writer.WriteEndElement();
                    }

                    foreach (var pair in set)
                    {
                        writer.WriteStartElement("node");
                        writer.WriteAttributeString("id", pair.Value);

                        writer.WriteStartElement("data");
                        writer.WriteAttributeString("key", "d0");
                        writer.WriteString(pair.Key.GetType().FullName);
                        writer.WriteEndElement();

                        var data = pair.Key.GetData();
                        if (data.Any())
                        {
                            foreach (var o in data)
                            {
                                var name    = pair.Key.GetType().Name + "." + o.Key;
                                var keyDesc = keys[name];

                                writer.WriteStartElement("data");
                                writer.WriteAttributeString("key", keyDesc.Id);
                                writer.WriteString(o.Value.ToString());
                                writer.WriteEndElement();
                            }
                        }

                        writer.WriteEndElement();
                    }

                    foreach (var pair in set)
                    {
                        foreach (var valueParent in pair.Key.Parents)
                        {
                            writer.WriteStartElement("edge");
                            writer.WriteAttributeString("source", set[valueParent]);
                            writer.WriteAttributeString("target", set[pair.Key]);
                            writer.WriteEndElement();
                        }
                    }

                    writer.WriteEndElement();

                    writer.WriteEndElement();
                }

                return(sw.ToString());
            }
        }
Beispiel #11
0
        public void Dispose()
        {
            var visitor = new OpVisitor <T>(op => { op.Dispose(); });

            this.Cost?.Accept(visitor);
        }