using NumSharp;
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Linq;
using System.Text;
namespace Tensorflow
{
///
/// Mapping C# functions to Python
///
public class Python
{
protected void print(object obj)
{
Console.WriteLine(obj.ToString());
}
//protected int len(IEnumerable a)
// => a.Count();
protected int len(object a)
{
switch (a)
{
case Array arr:
return arr.Length;
case IList arr:
return arr.Count;
case ICollection arr:
return arr.Count;
case NDArray ndArray:
return ndArray.len;
case IEnumerable enumerable:
return enumerable.OfType().Count();
}
throw new NotImplementedException("len() not implemented for type: " + a.GetType());
}
protected IEnumerable range(int end)
{
return Enumerable.Range(0, end);
}
protected IEnumerable range(int start, int end)
{
return Enumerable.Range(start, end - start);
}
public static T New(object args) where T : IPyClass
{
var instance = Activator.CreateInstance();
instance.__init__(instance, args);
return instance;
}
[DebuggerNonUserCode()] // with "Just My Code" enabled this lets the debugger break at the origin of the exception
public static void with(IPython py, Action action)
{
try
{
py.__enter__();
action(py);
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
throw;
}
finally
{
py.__exit__();
py.Dispose();
}
}
[DebuggerNonUserCode()] // with "Just My Code" enabled this lets the debugger break at the origin of the exception
public static void with(T py, Action action) where T : IPython
{
try
{
py.__enter__();
action(py);
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
throw;
}
finally
{
py.__exit__();
py.Dispose();
}
}
[DebuggerNonUserCode()] // with "Just My Code" enabled this lets the debugger break at the origin of the exception
public static TOut with(TIn py, Func action) where TIn : IPython
{
try
{
py.__enter__();
return action(py);
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
throw;
return default(TOut);
}
finally
{
py.__exit__();
py.Dispose();
}
}
public static float time()
{
return (float)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds;
}
public static IEnumerable<(T, T)> zip(NDArray t1, NDArray t2)
{
for (int i = 0; i < t1.size; i++)
yield return (t1.Data(i), t2.Data(i));
}
public static IEnumerable<(T1, T2)> zip(IList t1, IList t2)
{
for (int i = 0; i < t1.Count; i++)
yield return (t1[i], t2[i]);
}
public static IEnumerable<(T1, T2)> zip(NDArray t1, NDArray t2)
{
for (int i = 0; i < t1.size; i++)
yield return (t1.Data(i), t2.Data(i));
}
public static IEnumerable<(T1, T2)> zip(IEnumerable e1, IEnumerable e2)
{
var iter2 = e2.GetEnumerator();
foreach (var v1 in e1)
{
iter2.MoveNext();
var v2 = iter2.Current;
yield return (v1, v2);
}
}
public static IEnumerable<(int, T)> enumerate(IList values)
{
for (int i = 0; i < values.Count; i++)
yield return (i, values[i]);
}
public static Dictionary ConvertToDict(object dyn)
{
var dictionary = new Dictionary();
foreach (PropertyDescriptor propertyDescriptor in TypeDescriptor.GetProperties(dyn))
{
object obj = propertyDescriptor.GetValue(dyn);
string name = propertyDescriptor.Name;
dictionary.Add(name, obj);
}
return dictionary;
}
public static bool hasattr(object obj, string key)
{
var __type__ = (obj).GetType();
var __member__ = __type__.GetMembers();
var __memberobject__ = __type__.GetMember(key);
return (__memberobject__.Length > 0) ? true : false;
}
public delegate object __object__(params object[] args);
public static __object__ getattr(object obj, string key, params Type[] ___parameter_type__)
{
var __dyn_obj__ = obj.GetType().GetMember(key);
if (__dyn_obj__.Length == 0)
throw new Exception("The object \"" + nameof(obj) + "\" doesnot have a defination \"" + key + "\"");
var __type__ = __dyn_obj__[0];
if (__type__.MemberType == System.Reflection.MemberTypes.Method)
{
try
{
var __method__ = (___parameter_type__.Length > 0) ? obj.GetType().GetMethod(key, ___parameter_type__) : obj.GetType().GetMethod(key);
return (__object__)((object[] args) => __method__.Invoke(obj, args));
}
catch (System.Reflection.AmbiguousMatchException ex)
{
throw new Exception("AmbigousFunctionMatchFound : (Probable cause : Function Overloading) Please add parameter types of the function.");
}
}
else if (__type__.MemberType == System.Reflection.MemberTypes.Field)
{
var __field__ = (object)obj.GetType().GetField(key).GetValue(obj);
return (__object__)((object[] args) => { return __field__; });
}
else if (__type__.MemberType == System.Reflection.MemberTypes.Property)
{
var __property__ = (object)obj.GetType().GetProperty(key).GetValue(obj);
return (__object__)((object[] args) => { return __property__; });
}
return (__object__)((object[] args) => { return "NaN"; });
}
}
public interface IPython : IDisposable
{
void __enter__();
void __exit__();
}
public class PyObject where T : IPyClass
{
public T Instance { get; set; }
}
}