public void SInitialization() {
        for (int i=0;i<xDimension;i++) {
            for (int j=0;j<yDimension;j++) {
                columns.add(new Column(i, j));
                potentialSynapses.add(new LinkedList<Synapse>());
            }
        }
        
        overlap = new Double[xDimension*yDimension];
        Arrays.fill(overlap, 0.0);
        minDutyCycle = new Double[xDimension*yDimension];
        Arrays.fill(minDutyCycle, 0.0);
        activeDutyCycle = new Double[xDimension*yDimension];
        Arrays.fill(activeDutyCycle, 0.0);
        overlapDutyCycle = new Double[xDimension*yDimension];
        Arrays.fill(overlapDutyCycle, 0.0);
        boost = new Double[xDimension*yDimension];
        Arrays.fill(boost, 1.0);
        activeColumns = new LinkedList<LinkedList<Integer>>();
        inputBits = new LinkedList<Integer[][]>();
        inputBits.add(new Integer[xDimension][yDimension]);
        
        for(int k = 0;k<potentialSynapses.size();k++) {
            Column column = columns.get(k);
            LinkedList<Synapse> list = potentialSynapses.get(k);
            // TODO: Region's dimensions used to initialize proximal synapses - may be incorrect
            for(int i=0;i<xDimension*yDimension;i++) {
                Integer dimX = rnd.nextInt(xDimension);
                Integer dimY = rnd.nextInt(yDimension);
                Double perm = connectedPerm + connectedPerm / 2.0 - (rnd.nextDouble()/10.0);
                Double adjustment = Math.sqrt((((column.x - dimX))^2 +((column.y - dimY))^2)/(xDimension+yDimension));

                list.add(new Synapse(dimX, dimY, Math.max(perm - adjustment, 0.0)));
            }
        }

        activeState.add(new LinkedList<LinkedList<Boolean>>());
        learnState.add(new LinkedList<LinkedList<Boolean>>());
        predictiveState.add(new LinkedList<LinkedList<Boolean>>());        
        for(int c=0;c<xDimension*yDimension;c++) {
            dendriteSegments.add(new LinkedList<LinkedList<Segment>>());
            activeState.get(time).add(new LinkedList<Boolean>());
            learnState.get(time).add(new LinkedList<Boolean>());
            predictiveState.get(time).add(new LinkedList<Boolean>());
            segmentUpdateList.add(new LinkedList<LinkedList<segmentUpdate>>());
            for(int i=0;i<cellsPerColumn;i++) {
                activeState.get(time).get(c).add(false);
                learnState.get(time).get(c).add(false);
                predictiveState.get(time).get(c).add(false);
                dendriteSegments.get(c).add(new LinkedList<Segment>());
                segmentUpdateList.get(c).add(new LinkedList<segmentUpdate>());
            }
        }

        inhibitionRadius = averageReceptiveFieldSize();
        overlap = new Double[xDimension*yDimension];
        Arrays.fill(overlap, 0.0);
    }