public DecisionNet(DInput[] p_inputs, DOutput[] p_outputs, Matrix <float> p_weights)
                {
                    if (!MatrixCalc.isSize(p_weights, p_inputs.Length, p_outputs.Length))
                    {
                        Debug.LogError("Constructing DecisionNet with wrong sized matrix");
                    }

                    m_inputs  = p_inputs;
                    m_outputs = p_outputs;
                    m_weights = MatrixCalc.shallowClone(p_weights);
                }
                private void performOutputs(Matrix <float> p_output_values)
                {
                    if (!MatrixCalc.isSize(p_output_values, 1, m_outputs.Length))
                    {
                        Debug.LogError("Trying to perform outputs in Decision net with malformed output_values matrix");
                    }

                    for (int i = 0; i < m_outputs.Length; i++)
                    {
                        m_outputs[i](p_output_values[0, i]);
                    }
                }
                public DecisionNetDNA(int p_id, DInputFactory <T>[] p_inputs, DOutputFactory <T>[] p_outputs, Matrix <float> p_weights, Range <float> p_mutation_multiplier)
                {
                    if (!MatrixCalc.isSize(p_weights, p_inputs.Length, p_outputs.Length))
                    {
                        Debug.LogError("DecisionNetDNA requires Matrix input size inputs by outputs");
                    }

                    m_id                  = p_id;
                    m_inputs              = ArrayCalc.shallowClone(p_inputs);
                    m_outputs             = ArrayCalc.shallowClone(p_outputs);
                    m_weights             = MatrixCalc.shallowClone(MatrixCalc.columnNormalize(p_weights));
                    m_mutation_multiplier = p_mutation_multiplier;
                }