コード例 #1
0
        public SplitAxisPanel(SplitAxis axis)
            : this()
        {
            mAxis = axis;
            mAxis.AxisAdded += new Action<Interfaces.IAxis>(mAxis_AxisAdded);

            foreach (var subAx in axis.Axes)
                mAxis_AxisAdded(subAx);
        }
コード例 #2
0
        public SplitAxisPanel(SplitAxis axis)
            : this()
        {
            mAxis            = axis;
            mAxis.AxisAdded += new Action <Interfaces.IAxis>(mAxis_AxisAdded);

            foreach (var subAx in axis.Axes)
            {
                mAxis_AxisAdded(subAx);
            }
        }
コード例 #3
0
ファイル: TestSplitAxis.cs プロジェクト: ziichuan/KelpNet
        public void SplitAxisRandomTest()
        {
            Python.Initialize();
            Chainer.Initialize();

            int batchCount = Mother.Dice.Next(1, 5);
            int ch         = Mother.Dice.Next(1, 5);
            int widthA     = Mother.Dice.Next(1, 16);
            int widthB     = Mother.Dice.Next(1, 16);
            int height     = Mother.Dice.Next(1, 16);
            int axis       = 3;

            Real[,,,] input = Initializer.GetRandomValues <Real[, , , ]>(batchCount, ch, height, widthA + widthB);

            Real[,,,] dummyGyA = Initializer.GetRandomValues <Real[, , , ]>(batchCount, ch, height, widthA);
            Real[,,,] dummyGyB = Initializer.GetRandomValues <Real[, , , ]>(batchCount, ch, height, widthB);

            //chainer
            NChainer.SplitAxis <Real> cSplitAxis = new NChainer.SplitAxis <Real>();

            Variable <Real> cX = new Variable <Real>(input);

            PyObject[] cY = cSplitAxis.Forward(cX, new[] { widthA }, axis);

            Variable <Real> cY0 = cY[0];
            Variable <Real> cY1 = cY[1];

            cY0.Grad = dummyGyA;
            cY1.Grad = dummyGyB;

            //Chainerはどちらか一方で両方分のBackwardが走る
            cY0.Backward();
            //cY1.Backward();


            //KelpNet
            SplitAxis <Real> splitAxis = new SplitAxis <Real>(new[] { widthA }, axis - 1); //Chainerと異なり1次元目を暗黙的にBatchとみなさないため

            NdArray <Real> x = new NdArray <Real>(input, asBatch: true);                   // new NdArray(Real.ToRealArray(), new[] { ch, height, widthA + widthB }, batchCount);

            NdArray <Real>[] y = splitAxis.Forward(x);
            y[0].Grad = dummyGyA.Flatten();
            y[1].Grad = dummyGyB.Flatten();

            //KelpNetは出力した両方からBackwardしないと処理が走らない
            y[0].Backward();
            y[1].Backward();

            //Copyが必要
            Real[] cY0data = ((Real[, , , ])cY0.Data.Copy()).Flatten();
            Real[] cY1data = ((Real[, , , ])cY1.Data.Copy()).Flatten();

            Real[] cXgrad = ((Real[, , , ])cX.Grad).Flatten();

            //許容範囲を算出
            Real delta = 0.00001f;

            //y0
            Assert.AreEqual(cY0data.Length, y[0].Data.Length);
            for (int i = 0; i < y[0].Data.Length; i++)
            {
                Assert.AreEqual(cY0data[i], y[0].Data[i], delta);
            }

            //y1
            Assert.AreEqual(cY1data.Length, y[1].Data.Length);
            for (int i = 0; i < y[1].Data.Length; i++)
            {
                Assert.AreEqual(cY1data[i], y[1].Data[i], delta);
            }

            //x.grad
            Assert.AreEqual(cXgrad.Length, x.Grad.Length);
            for (int i = 0; i < x.Grad.Length; i++)
            {
                Assert.AreEqual(cXgrad[i], x.Grad[i], delta);
            }
        }
コード例 #4
0
ファイル: SplitRule.cs プロジェクト: sigr3s/Unity_CGA
    public void Execute(string input, ref CGAContext context)
    {
        string    ax = ParsingHelper.QSString(input);
        SplitAxis sa = (SplitAxis)Enum.Parse(typeof(SplitAxis), ax);;

        string target = ParsingHelper.GetTarget(input);

        string[]          destinations = ParsingHelper.GetDest(input);
        CSF               csfVals      = ParsingHelper.CSFValues(input);
        List <GameObject> t            = null;


        if (!string.IsNullOrEmpty(target) && context.namedObjects.ContainsKey(target))
        {
            t = context.namedObjects[target];
            List <GameObject> newNamedObjectContent = new List <GameObject>();
            Vector3           a = new Vector3(1, 0, 0);


            foreach (GameObject g in t)
            {
                GameObject newg = GameObject.Instantiate(g);
                newg.name = g.name;
                GameObject.Destroy(newg.GetComponent <MeshRenderer>());
                GameObject.Destroy(newg.GetComponent <MeshFilter>());
                newNamedObjectContent.Add(newg);
                newg.transform.SetParent(g.transform.parent);
                newg.transform.localScale    = g.transform.localScale;
                newg.transform.localPosition = g.transform.localPosition;
                newg.transform.localRotation = g.transform.localRotation;

                Transform[] trans = g.GetComponentsInChildren <Transform>();
                foreach (Transform tra in trans)
                {
                    if (tra.gameObject != g)
                    {
                        GameObject.Destroy(tra.gameObject);
                    }
                }

                GameObject tar   = g;
                Vector3    start = g.transform.position + g.transform.lossyScale / 2;
                int        s     = csfVals.orderedCSF.Count;
                float      size  = 0;

                switch (sa)
                {
                case SplitAxis.X:
                    a    = -g.transform.right;
                    size = g.transform.lossyScale.x;
                    break;

                case SplitAxis.Y:
                    a    = -g.transform.up;
                    size = g.transform.lossyScale.y;
                    break;

                case SplitAxis.Z:
                    a    = -g.transform.forward;
                    size = g.transform.lossyScale.z;
                    break;
                }

                List <float> sizes         = new List <float>();
                float        sizeOfDynamic = size;
                float        perc          = 0;

                foreach (float v in csfVals.fixedValues)
                {
                    sizeOfDynamic -= (size * v);
                    perc          += v;
                }
                if (perc > 1)
                {
                    Debug.LogWarning("You messed up something with percentages...");
                }

                int relativeCount = 0;
                foreach (int v in csfVals.relativeValues)
                {
                    relativeCount += v;
                }

                float             acumulatedPosition = 0;
                List <GameObject> splits             = new List <GameObject>();

                for (int i = 1; i < s; i++)
                {
                    if (csfVals.orderedCSF[i - 1].isRelative)
                    {
                        acumulatedPosition += (csfVals.relativeValues[csfVals.orderedCSF[i - 1].index] / (relativeCount * 1.0f)) * sizeOfDynamic;
                    }
                    else
                    {
                        acumulatedPosition += csfVals.fixedValues[csfVals.orderedCSF[i - 1].index] * size;
                    }
                    GameObject[] splited = MeshCut.Cut(tar, start + a * acumulatedPosition, a, tar.GetComponent <Renderer>().material); //((size/s) * i)
                    tar = splited[1];
                    if (destinations != null && destinations.Length > i)
                    {
                        string name = destinations[i - 1];
                        splited[0].name = name;
                        if (context.namedObjects.ContainsKey(name))
                        {
                            context.namedObjects[name].Add(splited[0]);
                        }
                        else
                        {
                            context.namedObjects.Add(name, new List <GameObject>()
                            {
                                splited[0]
                            });
                        }
                    }

                    splited[0].transform.SetParent(newg.transform);
                    splited[0].transform.localScale = Vector3.one;

                    splited[1].transform.SetParent(newg.transform);
                    splited[1].transform.localScale = Vector3.one;
                    if (destinations != null && destinations.Length > i && i == s - 1)
                    {
                        string name = destinations[i];
                        splited[1].name = name;
                        if (context.namedObjects.ContainsKey(name))
                        {
                            context.namedObjects[name].Add(splited[1]);
                        }
                        else
                        {
                            context.namedObjects.Add(name, new List <GameObject>()
                            {
                                splited[1]
                            });
                        }
                    }

                    if (i != s - 1)
                    {
                        splits.Add(splited[0]);
                    }
                    else
                    {
                        splits.Add(splited[0]);
                        splits.Add(splited[1]);
                    }
                }

                foreach (GameObject sgo in splits)
                {
                    MeshCut.UpdatePivot(sgo);
                }

                //Rebuild dict!
                context.namedObjects[target] = newNamedObjectContent;
            }
        }
        else
        {
            Debug.LogWarning("Cannot split without any target");
            return;
        }
    }